@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
|
@@ -2,6 +2,7 @@ import { currentCredentialMode } from '../request-context.js';
|
|
|
2
2
|
import { getCredits } from '../services/api-client.js';
|
|
3
3
|
import { CREDITS_PER_USD } from '../services/error-handler.js';
|
|
4
4
|
import { API_KEYS_URL, MCP_CONSOLE_URL, MCP_KEY_NAME, TOP_UP_URL } from '../services/http-policy.js';
|
|
5
|
+
import { trackedLink } from '../services/utm.js';
|
|
5
6
|
import { READ_ONLY, dailyLimitOf, errorResult, money, ok, usdOf } from './shared.js';
|
|
6
7
|
/** Below this the user is told the balance, or the limit, is nearly gone (about $1). */
|
|
7
8
|
const LOW_BALANCE_CREDITS = CREDITS_PER_USD;
|
|
@@ -31,13 +32,16 @@ export function registerCheckBalance(server, config) {
|
|
|
31
32
|
spent_credits: credits.token.used_credits,
|
|
32
33
|
spent_usd: usdOf(credits.token.used_credits),
|
|
33
34
|
has_limit: !credits.token.unlimited_credits,
|
|
34
|
-
top_up_url: TOP_UP_URL,
|
|
35
|
-
...(signedIn ? { mcp_settings_url: MCP_CONSOLE_URL } : {}),
|
|
35
|
+
top_up_url: trackedLink(TOP_UP_URL, 'top_up'),
|
|
36
|
+
...(signedIn ? { mcp_settings_url: trackedLink(MCP_CONSOLE_URL, 'api_keys') } : {}),
|
|
36
37
|
};
|
|
38
|
+
const daily = dailyLimitOf(credits.token);
|
|
37
39
|
if (credits.token.unlimited_credits) {
|
|
40
|
+
// A daily limit, if any, is named on its own line below: do not say that only the balance applies.
|
|
41
|
+
const spent = money(credits.token.used_credits);
|
|
38
42
|
lines.push(signedIn
|
|
39
|
-
? `${who} has spent ${
|
|
40
|
-
: `${who} has spent ${
|
|
43
|
+
? (daily ? `${who} has spent ${spent}; no total EvoLink MCP limit is set.` : `${who} has spent ${spent}; no EvoLink MCP limit is set, so only the account balance applies.`)
|
|
44
|
+
: (daily ? `${who} has spent ${spent} and has no total spending limit of its own.` : `${who} has spent ${spent} and has no spending limit of its own (the account balance applies).`));
|
|
41
45
|
}
|
|
42
46
|
else {
|
|
43
47
|
const left = Math.max(0, credits.token.remaining_credits);
|
|
@@ -45,19 +49,19 @@ export function registerCheckBalance(server, config) {
|
|
|
45
49
|
structured.limit_remaining_credits = left;
|
|
46
50
|
structured.limit_remaining_usd = usdOf(left);
|
|
47
51
|
if (left < LOW_BALANCE_CREDITS) {
|
|
52
|
+
const state = left <= 0 ? 'used up' : 'nearly used up';
|
|
48
53
|
lines.push(signedIn
|
|
49
|
-
? `The EvoLink MCP limit is
|
|
50
|
-
: `This API key's limit is
|
|
54
|
+
? `The EvoLink MCP limit is ${state} (it is a limit, not the account balance); the user can raise it at ${trackedLink(MCP_CONSOLE_URL, 'api_keys')} (the key named "${MCP_KEY_NAME}").`
|
|
55
|
+
: `This API key's limit is ${state}; raise it at ${trackedLink(API_KEYS_URL, 'api_keys')}.`);
|
|
51
56
|
}
|
|
52
57
|
}
|
|
53
|
-
const daily = dailyLimitOf(credits.token);
|
|
54
58
|
if (daily) {
|
|
55
59
|
const resets = `it resets at midnight${daily.zone ? ` (${daily.zone})` : ''}`;
|
|
56
60
|
lines.push(signedIn
|
|
57
61
|
? `Today EvoLink MCP has spent ${money(daily.used)} of its ${money(daily.limit)} daily limit; ${resets}.`
|
|
58
62
|
: `Today this API key has spent ${money(daily.used)} of its ${money(daily.limit)} daily limit; ${resets}.`);
|
|
59
63
|
if (daily.left < LOW_BALANCE_CREDITS)
|
|
60
|
-
lines.push(`Today's limit is nearly used up (${money(daily.left)} left).`);
|
|
64
|
+
lines.push(`Today's limit is ${daily.left <= 0 ? 'used up' : 'nearly used up'} (${money(daily.left)} left).`);
|
|
61
65
|
Object.assign(structured, {
|
|
62
66
|
daily_limit_credits: daily.limit,
|
|
63
67
|
daily_used_credits: daily.used,
|
|
@@ -67,7 +71,7 @@ export function registerCheckBalance(server, config) {
|
|
|
67
71
|
}
|
|
68
72
|
if (balance < LOW_BALANCE_CREDITS)
|
|
69
73
|
lines.push('The account balance is low; paid generations may be refused.');
|
|
70
|
-
lines.push(`Top up: ${TOP_UP_URL}`);
|
|
74
|
+
lines.push(`Top up: ${trackedLink(TOP_UP_URL, 'top_up')}`);
|
|
71
75
|
return ok(lines.join('\n'), structured);
|
|
72
76
|
}
|
|
73
77
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-balance.js","sourceRoot":"","sources":["../../../../../core/src/tools/check-balance.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAErF,wFAAwF;AACxF,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAE5C,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAoB;IAC1E,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;QACnC,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;YACX,iLAAiL;YACjL,mDAAmD;YACnD,2BAA2B;SAC5B,CAAC,IAAI,CAAC,GAAG,CAAC;QACX,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,SAAS,EAAE;KACtD,EAAE,KAAK,IAAI,EAAE;QACZ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;YACzC,4GAA4G;YAC5G,MAAM,QAAQ,GAAG,qBAAqB,EAAE,KAAK,WAAW,CAAC;YACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,wDAAwD,CAAC,CAAC,CAAC,cAAc,CAAC;YACjG,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,WAAW,CAAC;YACnE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,CAAC,oBAAoB,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrD,MAAM,UAAU,GAA4B;gBAC1C,uBAAuB,EAAE,OAAO;gBAChC,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC;gBACnC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACzC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY;gBACzC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC5C,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB;gBAC3C,UAAU,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"check-balance.js","sourceRoot":"","sources":["../../../../../core/src/tools/check-balance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estimate-cost.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/estimate-cost.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"estimate-cost.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/estimate-cost.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAgHlF"}
|
|
@@ -4,23 +4,25 @@ import { resolveModel, suggestModels } from '../services/model-catalog.js';
|
|
|
4
4
|
import { formatIssues, validateInput } from '../services/param-validator.js';
|
|
5
5
|
import { estimateCost, formatEstimateRange } from '../services/pricing-client.js';
|
|
6
6
|
import { API_KEYS_URL, MCP_CONSOLE_URL, MCP_KEY_NAME, TOP_UP_URL } from '../services/http-policy.js';
|
|
7
|
+
import { trackedLink } from '../services/utm.js';
|
|
7
8
|
import { currentCredentialMode } from '../request-context.js';
|
|
8
|
-
import { READ_ONLY, dailyLimitOf, errorResult, failure, money, ok } from './shared.js';
|
|
9
|
+
import { MEDIA_SECONDS_DESCRIPTION, MEDIA_SECONDS_MAX, READ_ONLY, dailyLimitOf, errorResult, failure, money, ok } from './shared.js';
|
|
9
10
|
export function registerEstimateCost(server, config) {
|
|
10
11
|
server.registerTool('estimate_cost', {
|
|
11
12
|
title: 'Estimate cost',
|
|
12
13
|
description: [
|
|
13
14
|
'Check a generation input and estimate what it will cost, without submitting anything. Free.',
|
|
14
15
|
'Returns whether the input is valid, the expected price range in USD and credits, what it is based on, and whether the account balance and any spending limit (the EvoLink MCP limit, or this API key\'s) cover it.',
|
|
15
|
-
'Call it before a paid generate_* call
|
|
16
|
+
'Call it before a paid generate_* call, then use the generation confirmation template in the server instructions.',
|
|
16
17
|
].join(' '),
|
|
17
18
|
inputSchema: {
|
|
18
19
|
model: z.string().min(1).max(128).describe('Model ID, e.g. "seedance-2.0-text-to-video".'),
|
|
19
20
|
input: z.record(z.unknown()).optional()
|
|
20
21
|
.describe('The input you plan to pass to the generate tool, e.g. {"prompt":"…","duration":5,"quality":"1080p"}.'),
|
|
22
|
+
media_seconds: z.number().positive().max(MEDIA_SECONDS_MAX).optional().describe(MEDIA_SECONDS_DESCRIPTION),
|
|
21
23
|
},
|
|
22
24
|
annotations: { title: 'Estimate cost', ...READ_ONLY },
|
|
23
|
-
}, async ({ model, input }) => {
|
|
25
|
+
}, async ({ model, input, media_seconds: mediaSeconds }) => {
|
|
24
26
|
try {
|
|
25
27
|
const { catalog, entry } = await resolveModel(model);
|
|
26
28
|
if (!entry) {
|
|
@@ -29,7 +31,7 @@ export function registerEstimateCost(server, config) {
|
|
|
29
31
|
}
|
|
30
32
|
const values = input ?? {};
|
|
31
33
|
const validation = entry.spec ? validateInput(entry.spec, values) : undefined;
|
|
32
|
-
const estimate = estimateCost(entry.priced, entry.kind, values, entry.spec);
|
|
34
|
+
const estimate = estimateCost(entry.priced, entry.kind, values, entry.spec, { mediaSeconds });
|
|
33
35
|
const lines = [`Estimate for ${entry.id} (${entry.kind}); nothing was submitted or charged.`];
|
|
34
36
|
if (!validation) {
|
|
35
37
|
lines.push('Input not checked: this model\'s parameters are not documented here.');
|
|
@@ -45,6 +47,8 @@ export function registerEstimateCost(server, config) {
|
|
|
45
47
|
const range = formatEstimateRange(estimate);
|
|
46
48
|
if (estimate.status === 'estimated' && range)
|
|
47
49
|
lines.push(`Estimated cost: ${range}`);
|
|
50
|
+
else if (estimate.status === 'partial' && range)
|
|
51
|
+
lines.push(`Partial estimate at published rates: ${range} (not a total or an upper bound).`);
|
|
48
52
|
else if (estimate.status === 'token_billed')
|
|
49
53
|
lines.push('Cost: billed by tokens used; it is only known after the task runs.');
|
|
50
54
|
else if (estimate.status === 'needs_input')
|
|
@@ -70,11 +74,11 @@ export function registerEstimateCost(server, config) {
|
|
|
70
74
|
const balance = Math.max(0, credits.user.remaining_credits);
|
|
71
75
|
lines.push(`Account balance: ${money(balance)}`);
|
|
72
76
|
structured.balance_credits = balance;
|
|
73
|
-
if (estimate.max_credits !== undefined) {
|
|
77
|
+
if (estimate.status === 'estimated' && estimate.max_credits !== undefined) {
|
|
74
78
|
const enough = balance >= estimate.max_credits;
|
|
75
79
|
structured.enough_balance = enough;
|
|
76
80
|
if (!enough)
|
|
77
|
-
lines.push(`The account balance may not cover this; top up at ${TOP_UP_URL}.`);
|
|
81
|
+
lines.push(`The account balance may not cover this; top up at ${trackedLink(TOP_UP_URL, 'top_up')}.`);
|
|
78
82
|
}
|
|
79
83
|
// The key's own limit is checked before the balance: warn now instead of failing on submit.
|
|
80
84
|
if (!credits.token.unlimited_credits) {
|
|
@@ -85,18 +89,18 @@ export function registerEstimateCost(server, config) {
|
|
|
85
89
|
: `This API key's limit left: ${money(left)}.`);
|
|
86
90
|
structured.limit_scope = signedIn ? 'mcp' : 'api_key';
|
|
87
91
|
structured.limit_remaining_credits = left;
|
|
88
|
-
if (estimate.max_credits !== undefined) {
|
|
92
|
+
if (estimate.status === 'estimated' && estimate.max_credits !== undefined) {
|
|
89
93
|
const enoughLimit = left >= estimate.max_credits;
|
|
90
94
|
structured.enough_limit = enoughLimit;
|
|
91
95
|
if (!enoughLimit) {
|
|
92
96
|
lines.push(signedIn
|
|
93
|
-
? `The EvoLink MCP limit may not cover this. It is a limit the user set, not the account balance; they can raise it at ${MCP_CONSOLE_URL} (the key named "${MCP_KEY_NAME}").`
|
|
94
|
-
: `This API key's limit may not cover this; raise it at ${API_KEYS_URL} or use another key.`);
|
|
97
|
+
? `The EvoLink MCP limit may not cover this. It is a limit the user set, not the account balance; they can raise it at ${trackedLink(MCP_CONSOLE_URL, 'api_keys')} (the key named "${MCP_KEY_NAME}").`
|
|
98
|
+
: `This API key's limit may not cover this; raise it at ${trackedLink(API_KEYS_URL, 'api_keys')} or use another key.`);
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
}
|
|
98
102
|
const daily = dailyLimitOf(credits.token);
|
|
99
|
-
if (daily && estimate.max_credits !== undefined) {
|
|
103
|
+
if (daily && estimate.status === 'estimated' && estimate.max_credits !== undefined) {
|
|
100
104
|
const signedIn = currentCredentialMode() === 'signed_in';
|
|
101
105
|
const enoughToday = daily.left >= estimate.max_credits;
|
|
102
106
|
structured.daily_left_credits = daily.left;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estimate-cost.js","sourceRoot":"","sources":["../../../../../core/src/tools/estimate-cost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAyB,MAAM,gCAAgC,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"estimate-cost.js","sourceRoot":"","sources":["../../../../../core/src/tools/estimate-cost.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/generate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/generate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA6EjD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAEnF"}
|
|
@@ -5,8 +5,9 @@ import { formatIssues, validateInput } from '../services/param-validator.js';
|
|
|
5
5
|
import { estimateCost, formatEstimateRange } from '../services/pricing-client.js';
|
|
6
6
|
import { CLIENT_REQUEST_ID_PATTERN, newRunId } from '../services/http-policy.js';
|
|
7
7
|
import { formatUsd } from '../services/error-handler.js';
|
|
8
|
-
import { PAID, errorResult, failure, money, ok, progressReporter, usdOf } from './shared.js';
|
|
9
|
-
import { TERMINAL_STATUSES, describeTask, waitForTask } from './task-format.js';
|
|
8
|
+
import { MEDIA_SECONDS_DESCRIPTION, MEDIA_SECONDS_MAX, PAID, errorResult, failure, money, ok, progressReporter, usdOf } from './shared.js';
|
|
9
|
+
import { RESULT_DELIVERY_GUIDANCE, TERMINAL_STATUSES, describeTask, waitForTask } from './task-format.js';
|
|
10
|
+
import { PAID_GENERATION_GUIDANCE } from '../tool-guidance.js';
|
|
10
11
|
const PATHS = {
|
|
11
12
|
image: '/v1/images/generations',
|
|
12
13
|
video: '/v1/videos/generations',
|
|
@@ -27,16 +28,43 @@ const AFTER = {
|
|
|
27
28
|
function description(kind) {
|
|
28
29
|
return [
|
|
29
30
|
DESCRIPTIONS[kind],
|
|
30
|
-
|
|
31
|
+
PAID_GENERATION_GUIDANCE,
|
|
31
32
|
'Find models with search_models and their parameters with get_model; pass the parameters in input.',
|
|
32
33
|
AFTER[kind],
|
|
33
34
|
'Never call this again to check progress or to "retry" a running task: each call creates and charges a new task.',
|
|
34
35
|
'After a network error or timeout, reuse the same client_request_id to retry without being charged twice.',
|
|
36
|
+
RESULT_DELIVERY_GUIDANCE,
|
|
35
37
|
].join(' ');
|
|
36
38
|
}
|
|
39
|
+
/** Longest prompt accepted through the prompt shortcut. */
|
|
40
|
+
const PROMPT_SHORTCUT_MAX = 20_000;
|
|
37
41
|
function rangeText(estimate) {
|
|
38
42
|
return formatEstimateRange(estimate) ?? 'unknown';
|
|
39
43
|
}
|
|
44
|
+
/** Why max_cost_usd could not be checked, and what the assistant can do next. */
|
|
45
|
+
function uncheckedCap(estimate, pricingWarning) {
|
|
46
|
+
if (estimate.uncheckable_reason === 'reference_video') {
|
|
47
|
+
return [
|
|
48
|
+
'this per-second video request uses input.video_urls, input.video_url or input.source_task_id, and published prices do not fully cover input video seconds or video-dependent billing multipliers',
|
|
49
|
+
'media_seconds cannot resolve this billing gap. Ask the user whether to proceed without a cap.',
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
if (estimate.status === 'token_billed') {
|
|
53
|
+
return ['it is billed by tokens used, so its cost is only known afterwards', 'Ask the user whether to proceed without a cap.'];
|
|
54
|
+
}
|
|
55
|
+
if (estimate.missing === 'media_seconds') {
|
|
56
|
+
return [
|
|
57
|
+
'it is billed per second and has no duration parameter, so EvoLink measures the seconds when the task runs (usually the length of the input video or audio)',
|
|
58
|
+
'If you know that length, pass it as media_seconds; otherwise ask the user whether to proceed without a cap.',
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
if (estimate.missing === 'duration') {
|
|
62
|
+
return ['it is billed per second and input.duration is not set', 'Set input.duration, or ask the user whether to proceed without a cap.'];
|
|
63
|
+
}
|
|
64
|
+
// Notes end with a full stop; the sentence around the reason adds its own.
|
|
65
|
+
const note = estimate.notes[0] ?? pricingWarning ?? 'no price could be found for it';
|
|
66
|
+
return [note.replace(/[.\s]+$/, ''), 'Ask the user whether to proceed without a cap.'];
|
|
67
|
+
}
|
|
40
68
|
export function registerGenerateTools(server, config) {
|
|
41
69
|
for (const kind of ['image', 'video', 'audio'])
|
|
42
70
|
registerGenerate(server, config, kind);
|
|
@@ -49,13 +77,15 @@ function registerGenerate(server, config, kind) {
|
|
|
49
77
|
description: description(kind),
|
|
50
78
|
inputSchema: {
|
|
51
79
|
model: z.string().min(1).max(128).describe(`${kind[0].toUpperCase()}${kind.slice(1)} model ID from search_models.`),
|
|
52
|
-
|
|
80
|
+
// The cap is checked in the handler: a schema limit makes the SDK answer with a bare validation error.
|
|
81
|
+
prompt: z.string().optional().describe(`Shortcut for input.prompt; up to ${PROMPT_SHORTCUT_MAX.toLocaleString('en-US')} characters (get_model lists the model's own limit).`),
|
|
53
82
|
input: z.record(z.unknown()).optional()
|
|
54
83
|
.describe('Model parameters exactly as listed by get_model, e.g. {"prompt":"…","quality":"1080p"}. Do not put model or callback_url here.'),
|
|
55
84
|
client_request_id: z.string().regex(CLIENT_REQUEST_ID_PATTERN).optional()
|
|
56
85
|
.describe('Optional idempotency key (16–96 characters: letters, digits, . _ -). Reuse the same value only to retry the same request after a network error or timeout.'),
|
|
57
86
|
max_cost_usd: z.number().positive().max(10_000).optional()
|
|
58
|
-
.describe('Optional spending cap:
|
|
87
|
+
.describe('Optional estimate-based spending cap: refuses to submit when the estimate is higher or cannot cover the full request. Per-second video requests with video_urls, video_url or source_task_id cannot use this cap, even with media_seconds.'),
|
|
88
|
+
media_seconds: z.number().positive().max(MEDIA_SECONDS_MAX).optional().describe(MEDIA_SECONDS_DESCRIPTION),
|
|
59
89
|
},
|
|
60
90
|
annotations: { title, ...PAID },
|
|
61
91
|
}, async (args, extra) => {
|
|
@@ -68,6 +98,12 @@ function registerGenerate(server, config, kind) {
|
|
|
68
98
|
charged: 'no',
|
|
69
99
|
});
|
|
70
100
|
}
|
|
101
|
+
if (args.prompt.length > PROMPT_SHORTCUT_MAX) {
|
|
102
|
+
return failure(`The prompt is ${args.prompt.length.toLocaleString('en-US')} characters; the limit is ${PROMPT_SHORTCUT_MAX.toLocaleString('en-US')}. Shorten it and try again. Nothing was submitted or charged.`, {
|
|
103
|
+
error: { category: 'invalid_request', param: 'prompt' },
|
|
104
|
+
charged: 'no',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
71
107
|
input.prompt = args.prompt;
|
|
72
108
|
}
|
|
73
109
|
let clientRequestId;
|
|
@@ -78,7 +114,7 @@ function registerGenerate(server, config, kind) {
|
|
|
78
114
|
return failure(`Unknown ${kind} model "${args.model}".${suggestions.length ? ` Did you mean: ${suggestions.join(', ')}?` : ''} Use search_models to find model IDs. Nothing was submitted or charged.`, { error: { category: 'not_found', param: 'model' }, suggestions, charged: 'no' });
|
|
79
115
|
}
|
|
80
116
|
if (entry.kind !== kind) {
|
|
81
|
-
return failure(`${entry.id} is a ${entry.kind} model; use generate_${entry.kind}. Nothing was submitted or charged.`, {
|
|
117
|
+
return failure(`${entry.id} is ${entry.kind === 'video' ? 'a' : 'an'} ${entry.kind} model; use generate_${entry.kind}. Nothing was submitted or charged.`, {
|
|
82
118
|
error: { category: 'invalid_request', param: 'model' },
|
|
83
119
|
use_tool: `generate_${entry.kind}`,
|
|
84
120
|
charged: 'no',
|
|
@@ -99,13 +135,12 @@ function registerGenerate(server, config, kind) {
|
|
|
99
135
|
else {
|
|
100
136
|
warnings.push('This model\'s parameters are not documented here, so the input was not checked before sending.');
|
|
101
137
|
}
|
|
102
|
-
|
|
138
|
+
// media_seconds only prices the request; the body below is built from input alone.
|
|
139
|
+
const estimate = estimateCost(entry.priced, kind, input, entry.spec, { mediaSeconds: args.media_seconds });
|
|
103
140
|
if (args.max_cost_usd !== undefined) {
|
|
104
|
-
if (estimate.status !== 'estimated' || estimate.max_usd === undefined) {
|
|
105
|
-
const reason = estimate.
|
|
106
|
-
|
|
107
|
-
: estimate.notes[0] ?? catalog.pricingWarning ?? 'no price could be found for it';
|
|
108
|
-
return failure(`max_cost_usd cannot be checked for ${entry.id}: ${reason}. Nothing was submitted or charged. Ask the user whether to proceed without a cap.`, {
|
|
141
|
+
if (estimate.uncheckable_reason !== undefined || estimate.status !== 'estimated' || estimate.max_usd === undefined) {
|
|
142
|
+
const [reason, next] = uncheckedCap(estimate, catalog.pricingWarning);
|
|
143
|
+
return failure(`max_cost_usd cannot be checked for ${entry.id}: ${reason}. Nothing was submitted or charged. ${next}`, {
|
|
109
144
|
error: { category: 'invalid_request', param: 'max_cost_usd' },
|
|
110
145
|
estimate,
|
|
111
146
|
charged: 'no',
|
|
@@ -156,6 +191,13 @@ function registerGenerate(server, config, kind) {
|
|
|
156
191
|
}
|
|
157
192
|
if (estimate.status === 'estimated')
|
|
158
193
|
lines.push(`Estimate before submitting: ${rangeText(estimate)}`);
|
|
194
|
+
if (estimate.status === 'partial') {
|
|
195
|
+
lines.push(`Partial estimate at published rates: ${rangeText(estimate)} (not a total or an upper bound).`);
|
|
196
|
+
for (const extra of estimate.possible_extras)
|
|
197
|
+
lines.push(`May also charge: ${extra}`);
|
|
198
|
+
for (const note of estimate.notes)
|
|
199
|
+
lines.push(`Note: ${note}`);
|
|
200
|
+
}
|
|
159
201
|
for (const warning of warnings)
|
|
160
202
|
lines.push(`Warning: ${warning}`);
|
|
161
203
|
lines.push(`client_request_id: ${clientRequestId}`);
|
|
@@ -166,8 +208,9 @@ function registerGenerate(server, config, kind) {
|
|
|
166
208
|
replayed: submitted.idempotency_replayed === true,
|
|
167
209
|
...(typeof reserved === 'number' ? { reserved_credits: reserved, reserved_usd: usdOf(reserved) } : {}),
|
|
168
210
|
...(estimate.status === 'estimated' ? { estimate: { min_usd: estimate.min_usd, max_usd: estimate.max_usd } } : {}),
|
|
211
|
+
...(estimate.status === 'partial' ? { estimate } : {}),
|
|
169
212
|
...(warnings.length ? { warnings } : {}),
|
|
170
|
-
});
|
|
213
|
+
}, view.resources);
|
|
171
214
|
}
|
|
172
215
|
catch (error) {
|
|
173
216
|
// clientRequestId is set right before the submit, so it also tells whether a request may have gone out.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../../core/src/tools/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAqB,MAAM,+BAA+B,CAAC;AACrG,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../../core/src/tools/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-model.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/get-model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-model.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/get-model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAY1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAelF;AAQD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyExD"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { modelParamsMeta } from '../data/model-params.js';
|
|
3
3
|
import { resolveModel, suggestModels } from '../services/model-catalog.js';
|
|
4
|
-
import { formatPrice } from '../services/pricing-client.js';
|
|
4
|
+
import { billedByMediaLength, formatPrice } from '../services/pricing-client.js';
|
|
5
5
|
import { formatUsd } from '../services/error-handler.js';
|
|
6
|
+
import { trackedLink } from '../services/utm.js';
|
|
6
7
|
import { READ_ONLY, errorResult, failure, ok } from './shared.js';
|
|
7
8
|
import { modelTitle } from './search-models.js';
|
|
8
9
|
function value(v) {
|
|
@@ -62,7 +63,8 @@ export function registerGetModel(server) {
|
|
|
62
63
|
tool: `generate_${entry.kind}`,
|
|
63
64
|
};
|
|
64
65
|
if (spec) {
|
|
65
|
-
|
|
66
|
+
const docs = trackedLink(spec.docs, 'model_docs');
|
|
67
|
+
lines.push(`Docs: ${docs}`, '', 'Input parameters (pass them in input):');
|
|
66
68
|
const names = Object.keys(spec.params).sort((a, b) => Number(!!spec.params[b].required) - Number(!!spec.params[a].required));
|
|
67
69
|
for (const name of names)
|
|
68
70
|
lines.push(...describeParam(name, spec.params[name]));
|
|
@@ -70,7 +72,7 @@ export function registerGetModel(server) {
|
|
|
70
72
|
lines.push('', `Example input: ${JSON.stringify(spec.example)}`);
|
|
71
73
|
Object.assign(structured, {
|
|
72
74
|
endpoint: spec.path,
|
|
73
|
-
docs
|
|
75
|
+
docs,
|
|
74
76
|
required: spec.required,
|
|
75
77
|
parameters: spec.params,
|
|
76
78
|
example_input: spec.example,
|
|
@@ -91,7 +93,13 @@ export function registerGetModel(server) {
|
|
|
91
93
|
for (const price of prices)
|
|
92
94
|
lines.push(`- ${priceLine(price)}`);
|
|
93
95
|
}
|
|
94
|
-
|
|
96
|
+
if (billedByMediaLength(priced, spec)) {
|
|
97
|
+
lines.push('This model has no duration parameter: EvoLink measures the billed seconds when the task runs (usually the length of the input video or audio). For an estimate before generating, pass that length as media_seconds to estimate_cost.');
|
|
98
|
+
structured.billed_by_media_length = true;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
lines.push('Use estimate_cost with your input for a total before generating.');
|
|
102
|
+
}
|
|
95
103
|
structured.prices = priced.prices;
|
|
96
104
|
}
|
|
97
105
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-model.js","sourceRoot":"","sources":["../../../../../core/src/tools/get-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAkB,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAiB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"get-model.js","sourceRoot":"","sources":["../../../../../core/src/tools/get-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-task.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/get-task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,eAAO,MAAM,OAAO,QAA6B,CAAC;AAClD,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAInC,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-task.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/get-task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,eAAO,MAAM,OAAO,QAA6B,CAAC;AAClD,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAInC,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA4C7E"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { READ_ONLY, errorResult, ok, progressReporter } from './shared.js';
|
|
3
|
-
import { TERMINAL_STATUSES, describeTask, waitForTask } from './task-format.js';
|
|
3
|
+
import { RESULT_DELIVERY_GUIDANCE, TERMINAL_STATUSES, describeTask, waitForTask } from './task-format.js';
|
|
4
4
|
export const TASK_ID = /^[A-Za-z0-9._:-]{4,128}$/;
|
|
5
5
|
/** Codex and Cursor drop a tool call after about 60 s; the reply also needs time to travel. */
|
|
6
6
|
export const MAX_WAIT_SECONDS = 45;
|
|
@@ -14,6 +14,7 @@ export function registerGetTask(server, config) {
|
|
|
14
14
|
'Returns the status, progress, result links (they expire after 24 hours, so give them to the user right away), the final charge, or the error with a next step.',
|
|
15
15
|
'If the task is still running when this returns, call get_task again.',
|
|
16
16
|
'Never call generate_image, generate_video or generate_audio again to check progress: that creates and charges a new task.',
|
|
17
|
+
RESULT_DELIVERY_GUIDANCE,
|
|
17
18
|
].join(' '),
|
|
18
19
|
inputSchema: {
|
|
19
20
|
task_id: z.string().regex(TASK_ID).describe('task_id returned by generate_image, generate_video or generate_audio'),
|
|
@@ -45,7 +46,7 @@ export function registerGetTask(server, config) {
|
|
|
45
46
|
view.lines.splice(1, 0, `Still running after waiting ${waited} s.`);
|
|
46
47
|
view.structured.waited_seconds = waited;
|
|
47
48
|
}
|
|
48
|
-
return ok(view.lines.join('\n'), view.structured);
|
|
49
|
+
return ok(view.lines.join('\n'), view.structured, view.resources);
|
|
49
50
|
}
|
|
50
51
|
catch (error) {
|
|
51
52
|
return errorResult(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-task.js","sourceRoot":"","sources":["../../../../../core/src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-task.js","sourceRoot":"","sources":["../../../../../core/src/tools/get-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-tasks.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/list-tasks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,SAAS,CAY9E;
|
|
1
|
+
{"version":3,"file":"list-tasks.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/list-tasks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,SAAS,CAY9E;AAyCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAsF/E"}
|
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
import { listTasks, queryTasks } from '../services/api-client.js';
|
|
3
3
|
import { READ_ONLY, errorResult, failure, money, ok, usdOf } from './shared.js';
|
|
4
4
|
import { TASK_ID } from './get-task.js';
|
|
5
|
-
import { RESULT_LINK_HOURS, resultLinks } from './task-format.js';
|
|
5
|
+
import { RESULT_DELIVERY_GUIDANCE, RESULT_DELIVERY_INSTRUCTIONS, RESULT_LINK_HOURS, resultDeliveryMarkdown, resultLinks, resultResources } from './task-format.js';
|
|
6
6
|
const MAX_IDS = 50;
|
|
7
7
|
/** ISO 8601, unix seconds, or relative such as 30m, 2h, 1d. */
|
|
8
8
|
export function parseSince(value, now = Date.now()) {
|
|
@@ -26,6 +26,8 @@ function rowFromTask(task) {
|
|
|
26
26
|
const links = resultLinks(task);
|
|
27
27
|
if (links.length > 0)
|
|
28
28
|
row.results = links;
|
|
29
|
+
if (task.status === 'completed' && links.length > 0)
|
|
30
|
+
row.delivery_markdown = resultDeliveryMarkdown(task.id, links);
|
|
29
31
|
const used = task.usage?.credits_used ?? task.usage?.cost?.credits;
|
|
30
32
|
if (task.status === 'completed' && typeof used === 'number') {
|
|
31
33
|
row.charged_credits = used;
|
|
@@ -55,6 +57,7 @@ export function registerListTasks(server, config) {
|
|
|
55
57
|
'Read several tasks at once by task_ids (up to 50, with result links), or find recent tasks by status, type and since. Free.',
|
|
56
58
|
'Use it to recover tasks after a lost connection or a timed-out submit before submitting anything again.',
|
|
57
59
|
'Recent tasks cover the whole EvoLink account, newest first.',
|
|
60
|
+
RESULT_DELIVERY_GUIDANCE,
|
|
58
61
|
].join(' '),
|
|
59
62
|
inputSchema: {
|
|
60
63
|
task_ids: z.array(z.string().regex(TASK_ID)).min(1).max(MAX_IDS).optional()
|
|
@@ -82,7 +85,9 @@ export function registerListTasks(server, config) {
|
|
|
82
85
|
lines.push(`Not found (wrong ID, expired, or another account): ${missing.join(', ')}`);
|
|
83
86
|
if (rows.some(row => row.results))
|
|
84
87
|
lines.push(`Result links expire after ${RESULT_LINK_HOURS} hours.`);
|
|
85
|
-
|
|
88
|
+
if (rows.some(row => row.results))
|
|
89
|
+
lines.push(`Next step: ${RESULT_DELIVERY_INSTRUCTIONS}`);
|
|
90
|
+
return ok(lines.join('\n'), { tasks: rows, missing }, rows.flatMap(row => resultResources(row.task_id, row.results ?? [])));
|
|
86
91
|
}
|
|
87
92
|
let sinceMs;
|
|
88
93
|
if (since) {
|
|
@@ -132,7 +137,9 @@ export function registerListTasks(server, config) {
|
|
|
132
137
|
lines.push(`${page.total} tasks match in total; raise limit or narrow the filters to see others.`);
|
|
133
138
|
if (rows.some(row => row.results))
|
|
134
139
|
lines.push(`Result links expire after ${RESULT_LINK_HOURS} hours.`);
|
|
135
|
-
|
|
140
|
+
if (rows.some(row => row.results))
|
|
141
|
+
lines.push(`Next step: ${RESULT_DELIVERY_INSTRUCTIONS}`);
|
|
142
|
+
return ok(lines.join('\n'), { tasks: rows, total: page.total }, rows.flatMap(row => resultResources(row.task_id, row.results ?? [])));
|
|
136
143
|
}
|
|
137
144
|
catch (error) {
|
|
138
145
|
return errorResult(error);
|