@evolinkai/mcp 1.3.0 → 1.4.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/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-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/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 +50 -11
- package/dist/core/src/server.js.map +1 -1
- package/dist/core/src/services/api-client.d.ts +13 -0
- package/dist/core/src/services/api-client.d.ts.map +1 -1
- package/dist/core/src/services/api-client.js +16 -0
- package/dist/core/src/services/api-client.js.map +1 -1
- 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 +155 -0
- package/dist/core/src/services/media-preview.js.map +1 -0
- 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 +67 -3
- 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 +14 -10
- 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 +56 -13
- package/dist/core/src/tools/generate.js.map +1 -1
- package/dist/core/src/tools/get-model.d.ts.map +1 -1
- package/dist/core/src/tools/get-model.js +12 -4
- 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.map +1 -1
- package/dist/core/src/tools/search-models.js +2 -1
- 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,3 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EVOLINK_FILES_BASE_URL points uploads at a staging files-api. HTTPS is
|
|
3
|
+
* required except for loopback development hosts.
|
|
4
|
+
*/
|
|
5
|
+
export declare function filesApiBaseUrl(): string;
|
|
6
|
+
/**
|
|
7
|
+
* The credential sent to files-api. Absent: the caller's own API key. Signed-in
|
|
8
|
+
* hosted connections have no key of their own, so they pass a short-lived
|
|
9
|
+
* upload token from the gateway (POST /v1/files/upload-token) instead.
|
|
10
|
+
*/
|
|
11
|
+
export interface FileUploadAuth {
|
|
12
|
+
bearer: string;
|
|
13
|
+
}
|
|
1
14
|
export interface FileUploadData {
|
|
2
15
|
file_id: string;
|
|
3
16
|
file_name: string;
|
|
@@ -17,8 +30,25 @@ interface FileApiResponse<T = unknown> {
|
|
|
17
30
|
data?: T;
|
|
18
31
|
request_id?: string;
|
|
19
32
|
}
|
|
20
|
-
export declare function fileBase64Upload(base64Data: string, uploadPath?: string, fileName?: string): Promise<FileApiResponse<FileUploadData>>;
|
|
21
|
-
export
|
|
22
|
-
|
|
33
|
+
export declare function fileBase64Upload(base64Data: string, uploadPath?: string, fileName?: string, auth?: FileUploadAuth): Promise<FileApiResponse<FileUploadData>>;
|
|
34
|
+
export interface StreamUploadOptions {
|
|
35
|
+
uploadPath?: string;
|
|
36
|
+
fileName?: string;
|
|
37
|
+
auth?: FileUploadAuth;
|
|
38
|
+
/** Tool name sent as X-Evo-Tool. */
|
|
39
|
+
tool?: string;
|
|
40
|
+
/** Aborts the upload, for example when the incoming body turns out too large. */
|
|
41
|
+
signal?: AbortSignal;
|
|
42
|
+
/** Overall timeout; defaults to EVOLINK_MCP_WRITE_TIMEOUT_MS. */
|
|
43
|
+
timeoutMs?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Streams a file to files-api as multipart/form-data without holding it in
|
|
47
|
+
* memory. With a known size the request carries Content-Length; otherwise it
|
|
48
|
+
* is sent chunked.
|
|
49
|
+
*/
|
|
50
|
+
export declare function fileStreamUploadFrom(source: AsyncIterable<Uint8Array>, size: number | undefined, mime: string, originalName: string, options?: StreamUploadOptions): Promise<FileApiResponse<FileUploadData>>;
|
|
51
|
+
export declare function fileStreamUpload(filePath: string, fileSize: number, mime: string, originalName: string, uploadPath?: string, fileName?: string, auth?: FileUploadAuth): Promise<FileApiResponse<FileUploadData>>;
|
|
52
|
+
export declare function fileUrlUpload(fileUrl: string, uploadPath?: string, fileName?: string, auth?: FileUploadAuth): Promise<FileApiResponse<FileUploadData>>;
|
|
23
53
|
export {};
|
|
24
54
|
//# sourceMappingURL=file-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-client.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/file-client.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe,CAAC,CAAC,GAAG,OAAO;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAwCD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"file-client.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/file-client.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAcxC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe,CAAC,CAAC,GAAG,OAAO;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAwCD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAK1C;AAUD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EACjC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAuC1C;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAE1C;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAK1C"}
|
|
@@ -5,11 +5,32 @@ import { getApiKey } from '../config.js';
|
|
|
5
5
|
import { ApiHttpError } from './api-client.js';
|
|
6
6
|
import { classifyGatewayError, formatGatewayError } from './error-handler.js';
|
|
7
7
|
import { DEFAULT_WRITE_TIMEOUT_MS, evoHeaders, fetchWithTimeout, newRunId, parseRetryAfter, readJsonBody, responseRequestId, timeoutFromEnv, } from './http-policy.js';
|
|
8
|
-
const
|
|
9
|
-
|
|
8
|
+
const DEFAULT_FILES_API_BASE_URL = 'https://files-api.evolink.ai';
|
|
9
|
+
/**
|
|
10
|
+
* EVOLINK_FILES_BASE_URL points uploads at a staging files-api. HTTPS is
|
|
11
|
+
* required except for loopback development hosts.
|
|
12
|
+
*/
|
|
13
|
+
export function filesApiBaseUrl() {
|
|
14
|
+
const override = (process.env.EVOLINK_FILES_BASE_URL ?? '').trim().replace(/\/+$/, '');
|
|
15
|
+
if (!override)
|
|
16
|
+
return DEFAULT_FILES_API_BASE_URL;
|
|
17
|
+
let parsed;
|
|
18
|
+
try {
|
|
19
|
+
parsed = new URL(override);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
throw new Error(`EVOLINK_FILES_BASE_URL is not a valid URL: ${override}`);
|
|
23
|
+
}
|
|
24
|
+
const loopback = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';
|
|
25
|
+
if (parsed.protocol !== 'https:' && !(parsed.protocol === 'http:' && loopback)) {
|
|
26
|
+
throw new Error('EVOLINK_FILES_BASE_URL must use HTTPS (or HTTP on localhost).');
|
|
27
|
+
}
|
|
28
|
+
return override;
|
|
29
|
+
}
|
|
30
|
+
function requestHeaders(tool, auth) {
|
|
10
31
|
const runId = newRunId();
|
|
11
32
|
return {
|
|
12
|
-
'Authorization': `Bearer ${getApiKey()}`,
|
|
33
|
+
'Authorization': `Bearer ${auth?.bearer ?? getApiKey()}`,
|
|
13
34
|
...evoHeaders(tool),
|
|
14
35
|
'Idempotency-Key': runId,
|
|
15
36
|
'X-Evo-Run-Id': runId,
|
|
@@ -34,21 +55,21 @@ async function parseResponse(response) {
|
|
|
34
55
|
body.request_id = requestId;
|
|
35
56
|
return body;
|
|
36
57
|
}
|
|
37
|
-
async function jsonUpload(path, body) {
|
|
38
|
-
const response = await fetchWithTimeout(`${
|
|
58
|
+
async function jsonUpload(path, body, auth) {
|
|
59
|
+
const response = await fetchWithTimeout(`${filesApiBaseUrl()}${path}`, {
|
|
39
60
|
method: 'POST',
|
|
40
|
-
headers: { ...requestHeaders('upload_file'), 'Content-Type': 'application/json' },
|
|
61
|
+
headers: { ...requestHeaders('upload_file', auth), 'Content-Type': 'application/json' },
|
|
41
62
|
body: JSON.stringify(body),
|
|
42
63
|
}, timeoutFromEnv('EVOLINK_MCP_WRITE_TIMEOUT_MS', DEFAULT_WRITE_TIMEOUT_MS));
|
|
43
64
|
return parseResponse(response);
|
|
44
65
|
}
|
|
45
|
-
export async function fileBase64Upload(base64Data, uploadPath, fileName) {
|
|
66
|
+
export async function fileBase64Upload(base64Data, uploadPath, fileName, auth) {
|
|
46
67
|
const body = { base64_data: base64Data };
|
|
47
68
|
if (uploadPath)
|
|
48
69
|
body.upload_path = uploadPath;
|
|
49
70
|
if (fileName)
|
|
50
71
|
body.file_name = fileName;
|
|
51
|
-
return jsonUpload('/api/v1/files/upload/base64', body);
|
|
72
|
+
return jsonUpload('/api/v1/files/upload/base64', body, auth);
|
|
52
73
|
}
|
|
53
74
|
function multipartField(name, value) {
|
|
54
75
|
return Buffer.from(`Content-Disposition: form-data; name="${name}"\r\n\r\n${value}\r\n`);
|
|
@@ -56,14 +77,19 @@ function multipartField(name, value) {
|
|
|
56
77
|
function safeDispositionValue(value) {
|
|
57
78
|
return value.replaceAll(/["\r\n]/g, '_');
|
|
58
79
|
}
|
|
59
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Streams a file to files-api as multipart/form-data without holding it in
|
|
82
|
+
* memory. With a known size the request carries Content-Length; otherwise it
|
|
83
|
+
* is sent chunked.
|
|
84
|
+
*/
|
|
85
|
+
export async function fileStreamUploadFrom(source, size, mime, originalName, options = {}) {
|
|
60
86
|
const boundary = `----evolink-${randomUUID()}`;
|
|
61
87
|
const prefix = Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${safeDispositionValue(originalName)}"\r\nContent-Type: ${mime}\r\n\r\n`);
|
|
62
88
|
const fields = [];
|
|
63
|
-
if (uploadPath)
|
|
64
|
-
fields.push(multipartField('uploadPath', uploadPath));
|
|
65
|
-
if (fileName)
|
|
66
|
-
fields.push(multipartField('fileName', fileName));
|
|
89
|
+
if (options.uploadPath)
|
|
90
|
+
fields.push(multipartField('uploadPath', options.uploadPath));
|
|
91
|
+
if (options.fileName)
|
|
92
|
+
fields.push(multipartField('fileName', options.fileName));
|
|
67
93
|
const tailParts = [Buffer.from('\r\n')];
|
|
68
94
|
for (const field of fields) {
|
|
69
95
|
tailParts.push(Buffer.from(`--${boundary}\r\n`), field);
|
|
@@ -72,29 +98,34 @@ export async function fileStreamUpload(filePath, fileSize, mime, originalName, u
|
|
|
72
98
|
const suffix = Buffer.concat(tailParts);
|
|
73
99
|
async function* multipartBody() {
|
|
74
100
|
yield prefix;
|
|
75
|
-
for await (const chunk of
|
|
101
|
+
for await (const chunk of source) {
|
|
76
102
|
yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
77
103
|
}
|
|
78
104
|
yield suffix;
|
|
79
105
|
}
|
|
80
|
-
const headers = requestHeaders('upload_file');
|
|
106
|
+
const headers = requestHeaders(options.tool ?? 'upload_file', options.auth);
|
|
81
107
|
headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;
|
|
82
|
-
|
|
108
|
+
if (size !== undefined)
|
|
109
|
+
headers['Content-Length'] = String(prefix.length + size + suffix.length);
|
|
83
110
|
const init = {
|
|
84
111
|
method: 'POST',
|
|
85
112
|
headers,
|
|
86
113
|
body: Readable.from(multipartBody()),
|
|
87
114
|
duplex: 'half',
|
|
115
|
+
signal: options.signal,
|
|
88
116
|
};
|
|
89
|
-
const response = await fetchWithTimeout(`${
|
|
117
|
+
const response = await fetchWithTimeout(`${filesApiBaseUrl()}/api/v1/files/upload/stream`, init, options.timeoutMs ?? timeoutFromEnv('EVOLINK_MCP_WRITE_TIMEOUT_MS', DEFAULT_WRITE_TIMEOUT_MS));
|
|
90
118
|
return parseResponse(response);
|
|
91
119
|
}
|
|
92
|
-
export async function
|
|
120
|
+
export async function fileStreamUpload(filePath, fileSize, mime, originalName, uploadPath, fileName, auth) {
|
|
121
|
+
return fileStreamUploadFrom(createReadStream(filePath), fileSize, mime, originalName, { uploadPath, fileName, auth });
|
|
122
|
+
}
|
|
123
|
+
export async function fileUrlUpload(fileUrl, uploadPath, fileName, auth) {
|
|
93
124
|
const body = { file_url: fileUrl };
|
|
94
125
|
if (uploadPath)
|
|
95
126
|
body.upload_path = uploadPath;
|
|
96
127
|
if (fileName)
|
|
97
128
|
body.file_name = fileName;
|
|
98
|
-
return jsonUpload('/api/v1/files/upload/url', body);
|
|
129
|
+
return jsonUpload('/api/v1/files/upload/url', body, auth);
|
|
99
130
|
}
|
|
100
131
|
//# sourceMappingURL=file-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-client.js","sourceRoot":"","sources":["../../../../../core/src/services/file-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,MAAM,
|
|
1
|
+
{"version":3,"file":"file-client.js","sourceRoot":"","sources":["../../../../../core/src/services/file-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
export declare const PREVIEW_LIMITS: {
|
|
3
|
+
readonly count: 2;
|
|
4
|
+
readonly edge: 384;
|
|
5
|
+
readonly outputBytes: number;
|
|
6
|
+
readonly imageBytes: number;
|
|
7
|
+
readonly videoBytes: number;
|
|
8
|
+
readonly timeoutMs: 15000;
|
|
9
|
+
readonly callBudgetMs: 55000;
|
|
10
|
+
};
|
|
11
|
+
export interface PreviewSource {
|
|
12
|
+
taskId: string;
|
|
13
|
+
url: string;
|
|
14
|
+
kind: 'image' | 'video';
|
|
15
|
+
}
|
|
16
|
+
export type Thumbnailer = (source: PreviewSource, signal: AbortSignal) => Promise<Buffer | undefined>;
|
|
17
|
+
/** Force a known local demuxer: do not let a mislabeled HTML, SVG or playlist choose its own decoder. */
|
|
18
|
+
export declare function previewFormat(data: Buffer, kind: PreviewSource['kind']): string | undefined;
|
|
19
|
+
/** Render only a small JPEG preview; the original file is never modified or replaced. */
|
|
20
|
+
export declare function decodePreview(data: Buffer, kind: PreviewSource['kind'], signal: AbortSignal): Promise<Buffer | undefined>;
|
|
21
|
+
export declare const createThumbnail: Thumbnailer;
|
|
22
|
+
/** Optional user-facing image blocks accompany, rather than replace, the original text and resource links. */
|
|
23
|
+
export declare function addResultPreviews(result: CallToolResult, thumbnailer?: Thumbnailer, parentSignal?: AbortSignal, remainingMs?: number): Promise<CallToolResult>;
|
|
24
|
+
//# sourceMappingURL=media-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-preview.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/media-preview.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,oCAAoC,CAAC;AAGvF,eAAO,MAAM,cAAc;;;;;;;;CAIjB,CAAC;AAEX,MAAM,WAAW,aAAa;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE;AACvF,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEtG,yGAAyG;AACzG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,CAW3F;AAED,yFAAyF;AACzF,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoC/H;AAGD,eAAO,MAAM,eAAe,EAAE,WAQ7B,CAAC;AAoBF,8GAA8G;AAC9G,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,GAAE,WAA6B,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,WAAW,GAAE,MAAiC,GAAG,OAAO,CAAC,cAAc,CAAC,CAmC/M"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { mkdtemp, writeFile, rm } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { downloadPreview } from './preview-download.js';
|
|
6
|
+
export const PREVIEW_LIMITS = {
|
|
7
|
+
count: 2, edge: 384, outputBytes: 96 * 1024,
|
|
8
|
+
imageBytes: 8 * 1024 * 1024, videoBytes: 32 * 1024 * 1024,
|
|
9
|
+
timeoutMs: 15_000, callBudgetMs: 55_000,
|
|
10
|
+
};
|
|
11
|
+
/** Force a known local demuxer: do not let a mislabeled HTML, SVG or playlist choose its own decoder. */
|
|
12
|
+
export function previewFormat(data, kind) {
|
|
13
|
+
if (kind === 'image') {
|
|
14
|
+
if (data.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])))
|
|
15
|
+
return 'png_pipe';
|
|
16
|
+
if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff)
|
|
17
|
+
return 'jpeg_pipe';
|
|
18
|
+
if (data.toString('ascii', 0, 4) === 'RIFF' && data.toString('ascii', 8, 12) === 'WEBP')
|
|
19
|
+
return 'webp_pipe';
|
|
20
|
+
if (/^GIF8[79]a$/.test(data.toString('ascii', 0, 6)))
|
|
21
|
+
return 'gif';
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
if (['ftyp', 'moov', 'mdat', 'wide', 'free'].includes(data.toString('ascii', 4, 8)))
|
|
25
|
+
return 'mov';
|
|
26
|
+
if (data.subarray(0, 4).equals(Buffer.from([0x1a, 0x45, 0xdf, 0xa3])))
|
|
27
|
+
return 'matroska';
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
/** Render only a small JPEG preview; the original file is never modified or replaced. */
|
|
32
|
+
export async function decodePreview(data, kind, signal) {
|
|
33
|
+
const format = previewFormat(data, kind);
|
|
34
|
+
if (!format || signal.aborted)
|
|
35
|
+
return undefined;
|
|
36
|
+
const directory = await mkdtemp(join(tmpdir(), 'evolink-preview-'));
|
|
37
|
+
try {
|
|
38
|
+
const input = join(directory, 'source');
|
|
39
|
+
await writeFile(input, data, { mode: 0o600 });
|
|
40
|
+
signal.throwIfAborted();
|
|
41
|
+
return await new Promise(resolve => {
|
|
42
|
+
const child = spawn('ffmpeg', [
|
|
43
|
+
'-hide_banner', '-loglevel', 'error', '-nostdin', '-max_alloc', '67108864',
|
|
44
|
+
'-threads', '1', '-filter_threads', '1', '-protocol_whitelist', 'file,pipe',
|
|
45
|
+
'-max_pixels', '16777216', '-f', format, '-i', input,
|
|
46
|
+
'-map', '0:v:0', '-frames:v', '1', '-an', '-sn', '-dn',
|
|
47
|
+
'-vf', `scale=w='min(${PREVIEW_LIMITS.edge},iw)':h='min(${PREVIEW_LIMITS.edge},ih)':force_original_aspect_ratio=decrease`,
|
|
48
|
+
'-threads', '1', '-c:v', 'mjpeg', '-q:v', '7', '-f', 'image2pipe', 'pipe:1',
|
|
49
|
+
], { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
50
|
+
const chunks = [];
|
|
51
|
+
let size = 0, oversized = false;
|
|
52
|
+
const abort = () => child.kill('SIGKILL');
|
|
53
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
54
|
+
if (signal.aborted)
|
|
55
|
+
abort();
|
|
56
|
+
child.stdout.on('data', (chunk) => {
|
|
57
|
+
size += chunk.length;
|
|
58
|
+
if (size > PREVIEW_LIMITS.outputBytes) {
|
|
59
|
+
oversized = true;
|
|
60
|
+
abort();
|
|
61
|
+
}
|
|
62
|
+
else
|
|
63
|
+
chunks.push(chunk);
|
|
64
|
+
});
|
|
65
|
+
child.on('error', () => { signal.removeEventListener('abort', abort); resolve(undefined); });
|
|
66
|
+
child.on('close', code => {
|
|
67
|
+
signal.removeEventListener('abort', abort);
|
|
68
|
+
resolve(code === 0 && !signal.aborted && !oversized ? Buffer.concat(chunks) : undefined);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await rm(directory, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
let inFlight = 0;
|
|
77
|
+
export const createThumbnail = async (source, signal) => {
|
|
78
|
+
// Extra previews are skipped during bursts; original delivery never queues behind a decoder.
|
|
79
|
+
if (inFlight >= 4)
|
|
80
|
+
return undefined;
|
|
81
|
+
inFlight++;
|
|
82
|
+
try {
|
|
83
|
+
const data = await downloadPreview(source.url, source.kind === 'image' ? PREVIEW_LIMITS.imageBytes : PREVIEW_LIMITS.videoBytes, signal);
|
|
84
|
+
return await decodePreview(data, source.kind, signal);
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
inFlight--;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
function sourcesOf(result) {
|
|
91
|
+
const structured = result.structuredContent;
|
|
92
|
+
if (!structured || result.isError || structured.ok === false)
|
|
93
|
+
return [];
|
|
94
|
+
const tasks = Array.isArray(structured.tasks) ? structured.tasks : [structured];
|
|
95
|
+
const sources = [];
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
for (const task of tasks) {
|
|
98
|
+
if (!task || typeof task !== 'object' || task.status !== 'completed' || !Array.isArray(task.results))
|
|
99
|
+
continue;
|
|
100
|
+
for (const link of task.results) {
|
|
101
|
+
if (!link || typeof link.url !== 'string' || !['image', 'video'].includes(link.kind) || seen.has(link.url))
|
|
102
|
+
continue;
|
|
103
|
+
seen.add(link.url);
|
|
104
|
+
sources.push({ taskId: task.task_id, url: link.url, kind: link.kind });
|
|
105
|
+
if (sources.length === PREVIEW_LIMITS.count)
|
|
106
|
+
return sources;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return sources;
|
|
110
|
+
}
|
|
111
|
+
/** Optional user-facing image blocks accompany, rather than replace, the original text and resource links. */
|
|
112
|
+
export async function addResultPreviews(result, thumbnailer = createThumbnail, parentSignal, remainingMs = PREVIEW_LIMITS.timeoutMs) {
|
|
113
|
+
const sources = sourcesOf(result);
|
|
114
|
+
if (!sources.length || parentSignal?.aborted || remainingMs <= 0)
|
|
115
|
+
return result;
|
|
116
|
+
const controller = new AbortController();
|
|
117
|
+
const abort = () => controller.abort();
|
|
118
|
+
parentSignal?.addEventListener('abort', abort, { once: true });
|
|
119
|
+
const timeout = setTimeout(abort, Math.min(PREVIEW_LIMITS.timeoutMs, remainingMs));
|
|
120
|
+
const images = [];
|
|
121
|
+
const metadata = [];
|
|
122
|
+
try {
|
|
123
|
+
for (const source of sources) {
|
|
124
|
+
if (controller.signal.aborted)
|
|
125
|
+
break;
|
|
126
|
+
try {
|
|
127
|
+
const data = await new Promise((resolve, reject) => {
|
|
128
|
+
const cancelled = () => resolve(undefined);
|
|
129
|
+
controller.signal.addEventListener('abort', cancelled, { once: true });
|
|
130
|
+
Promise.resolve().then(() => thumbnailer(source, controller.signal)).then(resolve, reject)
|
|
131
|
+
.finally(() => controller.signal.removeEventListener('abort', cancelled));
|
|
132
|
+
if (controller.signal.aborted)
|
|
133
|
+
cancelled();
|
|
134
|
+
});
|
|
135
|
+
if (!data || controller.signal.aborted || data.length > PREVIEW_LIMITS.outputBytes || previewFormat(data, 'image') !== 'jpeg_pipe')
|
|
136
|
+
continue;
|
|
137
|
+
const contentIndex = result.content.length + images.length;
|
|
138
|
+
images.push({ type: 'image', data: data.toString('base64'), mimeType: 'image/jpeg', annotations: { audience: ['user'], priority: 0.6 } });
|
|
139
|
+
metadata.push({ task_id: source.taskId, source_url: source.url, kind: source.kind === 'video' ? 'video_poster' : 'image_thumbnail', content_index: contentIndex, mime_type: 'image/jpeg' });
|
|
140
|
+
}
|
|
141
|
+
catch { /* A preview failure must not hide a successful paid generation or prompt a retry. */ }
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
clearTimeout(timeout);
|
|
146
|
+
parentSignal?.removeEventListener('abort', abort);
|
|
147
|
+
}
|
|
148
|
+
if (!images.length)
|
|
149
|
+
return result;
|
|
150
|
+
return {
|
|
151
|
+
...result, content: [...result.content, ...images],
|
|
152
|
+
structuredContent: { ...result.structuredContent, previews: metadata, preview_note: 'Small JPEG previews of the original results; video previews are still cover frames. Use the original links to view or download full-quality media. Preview display depends on the client.' },
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=media-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-preview.js","sourceRoot":"","sources":["../../../../../core/src/services/media-preview.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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,6GAA6G;AAC7G,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG;eAChD,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC;eAClC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;eAC7D,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;eAC/D,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;eAChE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,mFAAmF;QACnF,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM;eAC3D,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACnF,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC;WAC5F,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;WACzC,4DAA4D,CAAC,IAAI,CAAC,IAAI,CAAC;WACvE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAI,SAAqB,EAAE,MAAmB;IAC9D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,EAAE,CAAC;QAC5B,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAQ,EAAE,MAAmB,EAAE,OAAO,GAAG,MAAM;IAClF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACzH,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACpI,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC;AAED,2GAA2G;AAC3G,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAmB;IACxF,IAAI,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;gBACvB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM;gBAC7C,uEAAuE;gBACvE,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;gBAC1F,OAAO,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,uBAAuB,EAAE;aAC9E,EAAE,GAAG,CAAC,EAAE;gBACP,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC5D,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,IAAI,CAAC;wBACH,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ;4BAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;wBAC/D,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC/D,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAAC,CAAC;oBAClC,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC;oBAC/E,GAAG,CAAC,OAAO,EAAE,CAAC;oBAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;oBAAC,OAAO;gBACtF,CAAC;gBACD,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;gBACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC/B,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;oBACrB,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;wBACpB,GAAG,CAAC,OAAO,EAAE,CAAC;wBAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;wBAAC,OAAO;oBACvE,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC,CAAC,CAAC;gBACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACxB,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACxB,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC/C,GAAG,GAAG,QAAQ,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -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';
|
|
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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"}
|