@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,78 @@
|
|
|
1
|
+
import { currentCredentialMode } from '../request-context.js';
|
|
2
|
+
import { getCredits } from '../services/api-client.js';
|
|
3
|
+
import { CREDITS_PER_USD } from '../services/error-handler.js';
|
|
4
|
+
import { API_KEYS_URL, MCP_CONSOLE_URL, MCP_KEY_NAME, TOP_UP_URL } from '../services/http-policy.js';
|
|
5
|
+
import { READ_ONLY, dailyLimitOf, errorResult, money, ok, usdOf } from './shared.js';
|
|
6
|
+
/** Below this the user is told the balance, or the limit, is nearly gone (about $1). */
|
|
7
|
+
const LOW_BALANCE_CREDITS = CREDITS_PER_USD;
|
|
8
|
+
export function registerCheckBalance(server, config) {
|
|
9
|
+
server.registerTool('check_balance', {
|
|
10
|
+
title: 'Check balance',
|
|
11
|
+
description: [
|
|
12
|
+
'Show the EvoLink account balance and what has been spent: by EvoLink MCP in total (all assistants connected by sign-in) or by this API key, with its limit if one is set. Free.',
|
|
13
|
+
'Also a quick way to confirm the connection works.',
|
|
14
|
+
'Credits: 68 credits ≈ $1.',
|
|
15
|
+
].join(' '),
|
|
16
|
+
inputSchema: {},
|
|
17
|
+
annotations: { title: 'Check balance', ...READ_ONLY },
|
|
18
|
+
}, async () => {
|
|
19
|
+
try {
|
|
20
|
+
const credits = await getCredits(config);
|
|
21
|
+
// A signed-in connection spends the account's MCP key: its spend and limit cover every connected assistant.
|
|
22
|
+
const signedIn = currentCredentialMode() === 'signed_in';
|
|
23
|
+
const who = signedIn ? 'EvoLink MCP (all assistants connected to this account)' : 'This API key';
|
|
24
|
+
const limitName = signedIn ? 'the EvoLink MCP limit' : 'its limit';
|
|
25
|
+
const balance = Math.max(0, credits.user.remaining_credits);
|
|
26
|
+
const lines = [`Account balance: ${money(balance)}`];
|
|
27
|
+
const structured = {
|
|
28
|
+
account_balance_credits: balance,
|
|
29
|
+
account_balance_usd: usdOf(balance),
|
|
30
|
+
spent_scope: signedIn ? 'mcp' : 'api_key',
|
|
31
|
+
spent_credits: credits.token.used_credits,
|
|
32
|
+
spent_usd: usdOf(credits.token.used_credits),
|
|
33
|
+
has_limit: !credits.token.unlimited_credits,
|
|
34
|
+
top_up_url: TOP_UP_URL,
|
|
35
|
+
...(signedIn ? { mcp_settings_url: MCP_CONSOLE_URL } : {}),
|
|
36
|
+
};
|
|
37
|
+
if (credits.token.unlimited_credits) {
|
|
38
|
+
lines.push(signedIn
|
|
39
|
+
? `${who} has spent ${money(credits.token.used_credits)}; no EvoLink MCP limit is set, so only the account balance applies.`
|
|
40
|
+
: `${who} has spent ${money(credits.token.used_credits)} and has no spending limit of its own (the account balance applies).`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const left = Math.max(0, credits.token.remaining_credits);
|
|
44
|
+
lines.push(`${who} has spent ${money(credits.token.used_credits)}; ${money(left)} of ${limitName} is left.`);
|
|
45
|
+
structured.limit_remaining_credits = left;
|
|
46
|
+
structured.limit_remaining_usd = usdOf(left);
|
|
47
|
+
if (left < LOW_BALANCE_CREDITS) {
|
|
48
|
+
lines.push(signedIn
|
|
49
|
+
? `The EvoLink MCP limit is nearly used up (it is a limit, not the account balance); the user can raise it at ${MCP_CONSOLE_URL} (the key named "${MCP_KEY_NAME}").`
|
|
50
|
+
: `This API key's limit is nearly used up; raise it at ${API_KEYS_URL}.`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const daily = dailyLimitOf(credits.token);
|
|
54
|
+
if (daily) {
|
|
55
|
+
const resets = `it resets at midnight${daily.zone ? ` (${daily.zone})` : ''}`;
|
|
56
|
+
lines.push(signedIn
|
|
57
|
+
? `Today EvoLink MCP has spent ${money(daily.used)} of its ${money(daily.limit)} daily limit; ${resets}.`
|
|
58
|
+
: `Today this API key has spent ${money(daily.used)} of its ${money(daily.limit)} daily limit; ${resets}.`);
|
|
59
|
+
if (daily.left < LOW_BALANCE_CREDITS)
|
|
60
|
+
lines.push(`Today's limit is nearly used up (${money(daily.left)} left).`);
|
|
61
|
+
Object.assign(structured, {
|
|
62
|
+
daily_limit_credits: daily.limit,
|
|
63
|
+
daily_used_credits: daily.used,
|
|
64
|
+
daily_left_credits: daily.left,
|
|
65
|
+
...(daily.zone ? { reset_timezone: daily.zone } : {}),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (balance < LOW_BALANCE_CREDITS)
|
|
69
|
+
lines.push('The account balance is low; paid generations may be refused.');
|
|
70
|
+
lines.push(`Top up: ${TOP_UP_URL}`);
|
|
71
|
+
return ok(lines.join('\n'), structured);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return errorResult(error);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=check-balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-balance.js","sourceRoot":"","sources":["../../../../../core/src/tools/check-balance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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;AASjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA8GlF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getCredits } from '../services/api-client.js';
|
|
3
|
+
import { resolveModel, suggestModels } from '../services/model-catalog.js';
|
|
4
|
+
import { formatIssues, validateInput } from '../services/param-validator.js';
|
|
5
|
+
import { estimateCost, formatEstimateRange } from '../services/pricing-client.js';
|
|
6
|
+
import { API_KEYS_URL, MCP_CONSOLE_URL, MCP_KEY_NAME, TOP_UP_URL } from '../services/http-policy.js';
|
|
7
|
+
import { currentCredentialMode } from '../request-context.js';
|
|
8
|
+
import { READ_ONLY, dailyLimitOf, errorResult, failure, money, ok } from './shared.js';
|
|
9
|
+
export function registerEstimateCost(server, config) {
|
|
10
|
+
server.registerTool('estimate_cost', {
|
|
11
|
+
title: 'Estimate cost',
|
|
12
|
+
description: [
|
|
13
|
+
'Check a generation input and estimate what it will cost, without submitting anything. Free.',
|
|
14
|
+
'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 and tell the user the price.',
|
|
16
|
+
].join(' '),
|
|
17
|
+
inputSchema: {
|
|
18
|
+
model: z.string().min(1).max(128).describe('Model ID, e.g. "seedance-2.0-text-to-video".'),
|
|
19
|
+
input: z.record(z.unknown()).optional()
|
|
20
|
+
.describe('The input you plan to pass to the generate tool, e.g. {"prompt":"…","duration":5,"quality":"1080p"}.'),
|
|
21
|
+
},
|
|
22
|
+
annotations: { title: 'Estimate cost', ...READ_ONLY },
|
|
23
|
+
}, async ({ model, input }) => {
|
|
24
|
+
try {
|
|
25
|
+
const { catalog, entry } = await resolveModel(model);
|
|
26
|
+
if (!entry) {
|
|
27
|
+
const suggestions = suggestModels(catalog, model);
|
|
28
|
+
return failure(`Unknown model "${model}".${suggestions.length ? ` Did you mean: ${suggestions.join(', ')}?` : ''} Use search_models to find model IDs.`, { error: { category: 'not_found', param: 'model' }, suggestions });
|
|
29
|
+
}
|
|
30
|
+
const values = input ?? {};
|
|
31
|
+
const validation = entry.spec ? validateInput(entry.spec, values) : undefined;
|
|
32
|
+
const estimate = estimateCost(entry.priced, entry.kind, values, entry.spec);
|
|
33
|
+
const lines = [`Estimate for ${entry.id} (${entry.kind}); nothing was submitted or charged.`];
|
|
34
|
+
if (!validation) {
|
|
35
|
+
lines.push('Input not checked: this model\'s parameters are not documented here.');
|
|
36
|
+
}
|
|
37
|
+
else if (validation.errors.length > 0) {
|
|
38
|
+
lines.push(`Input problems (generate_${entry.kind} would refuse this input):`, ...formatIssues(validation.errors));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
lines.push('Input looks valid.');
|
|
42
|
+
}
|
|
43
|
+
if (validation?.warnings.length)
|
|
44
|
+
lines.push('Warnings:', ...formatIssues(validation.warnings));
|
|
45
|
+
const range = formatEstimateRange(estimate);
|
|
46
|
+
if (estimate.status === 'estimated' && range)
|
|
47
|
+
lines.push(`Estimated cost: ${range}`);
|
|
48
|
+
else if (estimate.status === 'token_billed')
|
|
49
|
+
lines.push('Cost: billed by tokens used; it is only known after the task runs.');
|
|
50
|
+
else if (estimate.status === 'needs_input')
|
|
51
|
+
lines.push('Cost: cannot estimate yet; see the note below.');
|
|
52
|
+
else
|
|
53
|
+
lines.push('Cost: no published price to estimate from.');
|
|
54
|
+
if (estimate.basis.length)
|
|
55
|
+
lines.push('Based on:', ...estimate.basis.map(line => `- ${line}`));
|
|
56
|
+
if (estimate.possible_extras.length)
|
|
57
|
+
lines.push('May also charge:', ...estimate.possible_extras.map(line => `- ${line}`));
|
|
58
|
+
for (const note of estimate.notes)
|
|
59
|
+
lines.push(`Note: ${note}`);
|
|
60
|
+
const structured = {
|
|
61
|
+
model: entry.id,
|
|
62
|
+
type: entry.kind,
|
|
63
|
+
input_valid: validation ? validation.errors.length === 0 : null,
|
|
64
|
+
problems: validation?.errors ?? [],
|
|
65
|
+
warnings: validation?.warnings ?? [],
|
|
66
|
+
estimate,
|
|
67
|
+
};
|
|
68
|
+
try {
|
|
69
|
+
const credits = await getCredits(config, 'estimate_cost');
|
|
70
|
+
const balance = Math.max(0, credits.user.remaining_credits);
|
|
71
|
+
lines.push(`Account balance: ${money(balance)}`);
|
|
72
|
+
structured.balance_credits = balance;
|
|
73
|
+
if (estimate.max_credits !== undefined) {
|
|
74
|
+
const enough = balance >= estimate.max_credits;
|
|
75
|
+
structured.enough_balance = enough;
|
|
76
|
+
if (!enough)
|
|
77
|
+
lines.push(`The account balance may not cover this; top up at ${TOP_UP_URL}.`);
|
|
78
|
+
}
|
|
79
|
+
// The key's own limit is checked before the balance: warn now instead of failing on submit.
|
|
80
|
+
if (!credits.token.unlimited_credits) {
|
|
81
|
+
const signedIn = currentCredentialMode() === 'signed_in';
|
|
82
|
+
const left = Math.max(0, credits.token.remaining_credits);
|
|
83
|
+
lines.push(signedIn
|
|
84
|
+
? `EvoLink MCP limit left: ${money(left)} (shared by all connected assistants).`
|
|
85
|
+
: `This API key's limit left: ${money(left)}.`);
|
|
86
|
+
structured.limit_scope = signedIn ? 'mcp' : 'api_key';
|
|
87
|
+
structured.limit_remaining_credits = left;
|
|
88
|
+
if (estimate.max_credits !== undefined) {
|
|
89
|
+
const enoughLimit = left >= estimate.max_credits;
|
|
90
|
+
structured.enough_limit = enoughLimit;
|
|
91
|
+
if (!enoughLimit) {
|
|
92
|
+
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.`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const daily = dailyLimitOf(credits.token);
|
|
99
|
+
if (daily && estimate.max_credits !== undefined) {
|
|
100
|
+
const signedIn = currentCredentialMode() === 'signed_in';
|
|
101
|
+
const enoughToday = daily.left >= estimate.max_credits;
|
|
102
|
+
structured.daily_left_credits = daily.left;
|
|
103
|
+
structured.enough_daily_limit = enoughToday;
|
|
104
|
+
if (!enoughToday) {
|
|
105
|
+
const resets = `it resets at midnight${daily.zone ? ` (${daily.zone})` : ''}`;
|
|
106
|
+
lines.push(signedIn
|
|
107
|
+
? `Today's EvoLink MCP limit may not cover this (${money(daily.left)} left today; ${resets}). It is a limit the user set, not the account balance.`
|
|
108
|
+
: `Today's limit of this API key may not cover this (${money(daily.left)} left today; ${resets}).`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
lines.push('Balance: could not be read right now.');
|
|
114
|
+
}
|
|
115
|
+
if (catalog.pricingWarning) {
|
|
116
|
+
lines.push(`Note: ${catalog.pricingWarning}`);
|
|
117
|
+
structured.pricing_warning = catalog.pricingWarning;
|
|
118
|
+
}
|
|
119
|
+
lines.push('This is an estimate from published prices. The amount actually reserved is shown when the task is submitted, and the final charge when it finishes.');
|
|
120
|
+
return ok(lines.join('\n'), structured);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return errorResult(error);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=estimate-cost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimate-cost.js","sourceRoot":"","sources":["../../../../../core/src/tools/estimate-cost.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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;AA+CjD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAEnF"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { submitTask } from '../services/api-client.js';
|
|
3
|
+
import { resolveModel, suggestModels } from '../services/model-catalog.js';
|
|
4
|
+
import { formatIssues, validateInput } from '../services/param-validator.js';
|
|
5
|
+
import { estimateCost, formatEstimateRange } from '../services/pricing-client.js';
|
|
6
|
+
import { CLIENT_REQUEST_ID_PATTERN, newRunId } from '../services/http-policy.js';
|
|
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';
|
|
10
|
+
const PATHS = {
|
|
11
|
+
image: '/v1/images/generations',
|
|
12
|
+
video: '/v1/videos/generations',
|
|
13
|
+
audio: '/v1/audios/generations',
|
|
14
|
+
};
|
|
15
|
+
/** Images usually finish in seconds, so the tool waits for them; video and audio return the task at once. */
|
|
16
|
+
const WAIT_MS = { image: 40_000, video: 0, audio: 0 };
|
|
17
|
+
const DESCRIPTIONS = {
|
|
18
|
+
image: 'Generate or edit images with an EvoLink image model. PAID: charges the user\'s EvoLink balance.',
|
|
19
|
+
video: 'Generate a video with an EvoLink video model (text-to-video, image-to-video, reference, edit, extend). PAID: charges the user\'s EvoLink balance.',
|
|
20
|
+
audio: 'Generate music, songs or speech with an EvoLink audio model. PAID: charges the user\'s EvoLink balance.',
|
|
21
|
+
};
|
|
22
|
+
const AFTER = {
|
|
23
|
+
image: 'Waits up to 40 s and returns the image links when ready; otherwise returns the task_id for get_task.',
|
|
24
|
+
video: 'Returns a task_id at once (videos take minutes); then call get_task, which can wait up to 45 s per call.',
|
|
25
|
+
audio: 'Returns a task_id at once; then call get_task, which can wait up to 45 s per call.',
|
|
26
|
+
};
|
|
27
|
+
function description(kind) {
|
|
28
|
+
return [
|
|
29
|
+
DESCRIPTIONS[kind],
|
|
30
|
+
'Before calling, get the price with estimate_cost (or get_model) and tell the user, unless they already approved this spend.',
|
|
31
|
+
'Find models with search_models and their parameters with get_model; pass the parameters in input.',
|
|
32
|
+
AFTER[kind],
|
|
33
|
+
'Never call this again to check progress or to "retry" a running task: each call creates and charges a new task.',
|
|
34
|
+
'After a network error or timeout, reuse the same client_request_id to retry without being charged twice.',
|
|
35
|
+
].join(' ');
|
|
36
|
+
}
|
|
37
|
+
function rangeText(estimate) {
|
|
38
|
+
return formatEstimateRange(estimate) ?? 'unknown';
|
|
39
|
+
}
|
|
40
|
+
export function registerGenerateTools(server, config) {
|
|
41
|
+
for (const kind of ['image', 'video', 'audio'])
|
|
42
|
+
registerGenerate(server, config, kind);
|
|
43
|
+
}
|
|
44
|
+
function registerGenerate(server, config, kind) {
|
|
45
|
+
const name = `generate_${kind}`;
|
|
46
|
+
const title = `Generate ${kind} (paid)`;
|
|
47
|
+
server.registerTool(name, {
|
|
48
|
+
title,
|
|
49
|
+
description: description(kind),
|
|
50
|
+
inputSchema: {
|
|
51
|
+
model: z.string().min(1).max(128).describe(`${kind[0].toUpperCase()}${kind.slice(1)} model ID from search_models.`),
|
|
52
|
+
prompt: z.string().max(20_000).optional().describe('Shortcut for input.prompt.'),
|
|
53
|
+
input: z.record(z.unknown()).optional()
|
|
54
|
+
.describe('Model parameters exactly as listed by get_model, e.g. {"prompt":"…","quality":"1080p"}. Do not put model or callback_url here.'),
|
|
55
|
+
client_request_id: z.string().regex(CLIENT_REQUEST_ID_PATTERN).optional()
|
|
56
|
+
.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
|
+
max_cost_usd: z.number().positive().max(10_000).optional()
|
|
58
|
+
.describe('Optional spending cap: if the estimated cost is higher, nothing is submitted.'),
|
|
59
|
+
},
|
|
60
|
+
annotations: { title, ...PAID },
|
|
61
|
+
}, async (args, extra) => {
|
|
62
|
+
const started = Date.now();
|
|
63
|
+
const input = { ...(args.input ?? {}) };
|
|
64
|
+
if (args.prompt !== undefined) {
|
|
65
|
+
if (input.prompt !== undefined && input.prompt !== args.prompt) {
|
|
66
|
+
return failure('prompt was given twice with different values (prompt and input.prompt). Pass it once. Nothing was submitted or charged.', {
|
|
67
|
+
error: { category: 'invalid_request', param: 'prompt' },
|
|
68
|
+
charged: 'no',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
input.prompt = args.prompt;
|
|
72
|
+
}
|
|
73
|
+
let clientRequestId;
|
|
74
|
+
try {
|
|
75
|
+
const { catalog, entry } = await resolveModel(args.model);
|
|
76
|
+
if (!entry) {
|
|
77
|
+
const suggestions = suggestModels(catalog, args.model, kind);
|
|
78
|
+
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
|
+
}
|
|
80
|
+
if (entry.kind !== kind) {
|
|
81
|
+
return failure(`${entry.id} is a ${entry.kind} model; use generate_${entry.kind}. Nothing was submitted or charged.`, {
|
|
82
|
+
error: { category: 'invalid_request', param: 'model' },
|
|
83
|
+
use_tool: `generate_${entry.kind}`,
|
|
84
|
+
charged: 'no',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const warnings = [];
|
|
88
|
+
if (entry.spec) {
|
|
89
|
+
const validation = validateInput(entry.spec, input);
|
|
90
|
+
if (validation.errors.length > 0) {
|
|
91
|
+
return failure([
|
|
92
|
+
`The input for ${entry.id} has problems; nothing was submitted or charged:`,
|
|
93
|
+
...formatIssues(validation.errors),
|
|
94
|
+
'get_model lists every parameter with its allowed values.',
|
|
95
|
+
].join('\n'), { error: { category: 'invalid_request' }, problems: validation.errors, charged: 'no' });
|
|
96
|
+
}
|
|
97
|
+
warnings.push(...validation.warnings.map(issue => `${issue.param} ${issue.problem}`));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
warnings.push('This model\'s parameters are not documented here, so the input was not checked before sending.');
|
|
101
|
+
}
|
|
102
|
+
const estimate = estimateCost(entry.priced, kind, input, entry.spec);
|
|
103
|
+
if (args.max_cost_usd !== undefined) {
|
|
104
|
+
if (estimate.status !== 'estimated' || estimate.max_usd === undefined) {
|
|
105
|
+
const reason = estimate.status === 'token_billed'
|
|
106
|
+
? 'it is billed by tokens used, so its cost is only known afterwards'
|
|
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.`, {
|
|
109
|
+
error: { category: 'invalid_request', param: 'max_cost_usd' },
|
|
110
|
+
estimate,
|
|
111
|
+
charged: 'no',
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (estimate.max_usd > args.max_cost_usd) {
|
|
115
|
+
return failure(`The estimated cost ${rangeText(estimate)} is above max_cost_usd $${formatUsd(args.max_cost_usd)}. Nothing was submitted or charged. Lower the duration, count or quality, or ask the user to raise the cap.`, {
|
|
116
|
+
error: { category: 'invalid_request', param: 'max_cost_usd' },
|
|
117
|
+
estimate,
|
|
118
|
+
charged: 'no',
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
clientRequestId = args.client_request_id ?? newRunId();
|
|
123
|
+
const body = { ...input, model: entry.id };
|
|
124
|
+
const submitted = await submitTask(config, {
|
|
125
|
+
path: entry.spec?.path ?? PATHS[kind],
|
|
126
|
+
body,
|
|
127
|
+
tool: name,
|
|
128
|
+
idempotencyKey: clientRequestId,
|
|
129
|
+
});
|
|
130
|
+
let task = submitted;
|
|
131
|
+
const waitUntil = started + WAIT_MS[kind];
|
|
132
|
+
if (!TERMINAL_STATUSES.has(task.status) && WAIT_MS[kind] > 0 && Date.now() + 3_000 < waitUntil) {
|
|
133
|
+
const report = progressReporter(extra, WAIT_MS[kind] / 1000);
|
|
134
|
+
try {
|
|
135
|
+
task = await waitForTask(config, submitted.id, {
|
|
136
|
+
deadline: waitUntil,
|
|
137
|
+
tool: name,
|
|
138
|
+
signal: extra.signal,
|
|
139
|
+
onPoll: current => report((Date.now() - started) / 1000, `${current.status}, ${current.progress ?? 0}%`),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// The task exists; a failed status read must not turn a successful submit into an error.
|
|
144
|
+
task = submitted;
|
|
145
|
+
}
|
|
146
|
+
task.usage = { ...submitted.usage, ...task.usage };
|
|
147
|
+
}
|
|
148
|
+
const view = describeTask({ ...task, request_id: task.request_id ?? submitted.request_id });
|
|
149
|
+
const header = submitted.idempotency_replayed
|
|
150
|
+
? `This client_request_id was used before: returning the original task (no new charge).`
|
|
151
|
+
: `Submitted ${entry.id}.`;
|
|
152
|
+
const lines = [header, ...view.lines];
|
|
153
|
+
const reserved = submitted.usage?.credits_reserved;
|
|
154
|
+
if (typeof reserved === 'number' && reserved > 0 && !lines.some(line => line.startsWith('Reserved:')) && task.status !== 'completed') {
|
|
155
|
+
lines.push(`Reserved: ${money(reserved)}`);
|
|
156
|
+
}
|
|
157
|
+
if (estimate.status === 'estimated')
|
|
158
|
+
lines.push(`Estimate before submitting: ${rangeText(estimate)}`);
|
|
159
|
+
for (const warning of warnings)
|
|
160
|
+
lines.push(`Warning: ${warning}`);
|
|
161
|
+
lines.push(`client_request_id: ${clientRequestId}`);
|
|
162
|
+
return ok(lines.join('\n'), {
|
|
163
|
+
...view.structured,
|
|
164
|
+
submitted: { model: entry.id, input },
|
|
165
|
+
client_request_id: clientRequestId,
|
|
166
|
+
replayed: submitted.idempotency_replayed === true,
|
|
167
|
+
...(typeof reserved === 'number' ? { reserved_credits: reserved, reserved_usd: usdOf(reserved) } : {}),
|
|
168
|
+
...(estimate.status === 'estimated' ? { estimate: { min_usd: estimate.min_usd, max_usd: estimate.max_usd } } : {}),
|
|
169
|
+
...(warnings.length ? { warnings } : {}),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
// clientRequestId is set right before the submit, so it also tells whether a request may have gone out.
|
|
174
|
+
return errorResult(error, { paid: clientRequestId !== undefined, clientRequestId });
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../../core/src/tools/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { type ParamSpec } from '../data/model-params.js';
|
|
3
|
+
export declare function describeParam(name: string, spec: ParamSpec, indent?: string): string[];
|
|
4
|
+
export declare function registerGetModel(server: McpServer): void;
|
|
5
|
+
//# sourceMappingURL=get-model.d.ts.map
|
|
@@ -0,0 +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;AAW1E,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,CAmExD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { modelParamsMeta } from '../data/model-params.js';
|
|
3
|
+
import { resolveModel, suggestModels } from '../services/model-catalog.js';
|
|
4
|
+
import { formatPrice } from '../services/pricing-client.js';
|
|
5
|
+
import { formatUsd } from '../services/error-handler.js';
|
|
6
|
+
import { READ_ONLY, errorResult, failure, ok } from './shared.js';
|
|
7
|
+
import { modelTitle } from './search-models.js';
|
|
8
|
+
function value(v) {
|
|
9
|
+
return JSON.stringify(v);
|
|
10
|
+
}
|
|
11
|
+
export function describeParam(name, spec, indent = '') {
|
|
12
|
+
const facts = [spec.type, spec.required ? 'required' : undefined].filter(Boolean);
|
|
13
|
+
const details = [];
|
|
14
|
+
if (spec.enum?.length)
|
|
15
|
+
details.push(`one of ${spec.enum.map(value).join(', ')}`);
|
|
16
|
+
if (spec.default !== undefined)
|
|
17
|
+
details.push(`default ${value(spec.default)}`);
|
|
18
|
+
if (spec.minimum !== undefined || spec.maximum !== undefined)
|
|
19
|
+
details.push(`range ${spec.minimum ?? '…'}–${spec.maximum ?? '…'}`);
|
|
20
|
+
if (spec.minItems !== undefined || spec.maxItems !== undefined)
|
|
21
|
+
details.push(`${spec.minItems ?? 0}–${spec.maxItems ?? '…'} items`);
|
|
22
|
+
if (spec.maxLength !== undefined)
|
|
23
|
+
details.push(`up to ${spec.maxLength} characters`);
|
|
24
|
+
if (spec.items?.enum?.length)
|
|
25
|
+
details.push(`each one of ${spec.items.enum.map(value).join(', ')}`);
|
|
26
|
+
const head = `${indent}- ${name}${facts.length ? ` (${facts.join(', ')})` : ''}${details.length ? `: ${details.join('; ')}` : ''}`;
|
|
27
|
+
const lines = [spec.description ? `${head} — ${spec.description}` : head];
|
|
28
|
+
for (const [child, childSpec] of Object.entries(spec.properties ?? spec.items?.properties ?? {})) {
|
|
29
|
+
lines.push(...describeParam(child, childSpec, `${indent} `));
|
|
30
|
+
}
|
|
31
|
+
return lines;
|
|
32
|
+
}
|
|
33
|
+
function priceLine(price) {
|
|
34
|
+
const minimum = price.min_charge_usd !== undefined ? ` (minimum $${formatUsd(price.min_charge_usd)} per task)` : '';
|
|
35
|
+
const factors = price.multipliers ? ` (resolution factors ${Object.entries(price.multipliers).map(([k, v]) => `${k} ×${v}`).join(', ')})` : '';
|
|
36
|
+
return `${price.name}: ${formatPrice(price)}${minimum}${factors}`;
|
|
37
|
+
}
|
|
38
|
+
export function registerGetModel(server) {
|
|
39
|
+
server.registerTool('get_model', {
|
|
40
|
+
title: 'Get model parameters and pricing',
|
|
41
|
+
description: [
|
|
42
|
+
'Show what one model accepts and what it costs: every input parameter (required, allowed values, ranges, defaults), the published prices and an example input. Free.',
|
|
43
|
+
'Read this before calling generate_image, generate_video or generate_audio, and quote the price to the user.',
|
|
44
|
+
].join(' '),
|
|
45
|
+
inputSchema: {
|
|
46
|
+
model: z.string().min(1).max(128).describe('Model ID from search_models, e.g. "seedance-2.0-text-to-video".'),
|
|
47
|
+
},
|
|
48
|
+
annotations: { title: 'Get model parameters and pricing', ...READ_ONLY },
|
|
49
|
+
}, async ({ model }) => {
|
|
50
|
+
try {
|
|
51
|
+
const { catalog, entry } = await resolveModel(model);
|
|
52
|
+
if (!entry) {
|
|
53
|
+
const suggestions = suggestModels(catalog, model);
|
|
54
|
+
return failure(`Unknown model "${model}".${suggestions.length ? ` Did you mean: ${suggestions.join(', ')}?` : ''} Use search_models to find model IDs.`, { error: { category: 'not_found', param: 'model' }, suggestions });
|
|
55
|
+
}
|
|
56
|
+
const { spec, priced } = entry;
|
|
57
|
+
const title = modelTitle(entry);
|
|
58
|
+
const lines = [`${entry.id} (${entry.kind})${title ? ` — ${title}` : ''}`, `Generate with: generate_${entry.kind}`];
|
|
59
|
+
const structured = {
|
|
60
|
+
model: entry.id,
|
|
61
|
+
type: entry.kind,
|
|
62
|
+
tool: `generate_${entry.kind}`,
|
|
63
|
+
};
|
|
64
|
+
if (spec) {
|
|
65
|
+
lines.push(`Docs: ${spec.docs}`, '', 'Input parameters (pass them in input):');
|
|
66
|
+
const names = Object.keys(spec.params).sort((a, b) => Number(!!spec.params[b].required) - Number(!!spec.params[a].required));
|
|
67
|
+
for (const name of names)
|
|
68
|
+
lines.push(...describeParam(name, spec.params[name]));
|
|
69
|
+
if (spec.example)
|
|
70
|
+
lines.push('', `Example input: ${JSON.stringify(spec.example)}`);
|
|
71
|
+
Object.assign(structured, {
|
|
72
|
+
endpoint: spec.path,
|
|
73
|
+
docs: spec.docs,
|
|
74
|
+
required: spec.required,
|
|
75
|
+
parameters: spec.params,
|
|
76
|
+
example_input: spec.example,
|
|
77
|
+
parameters_source: modelParamsMeta(),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
lines.push('', 'Parameters for this model are not documented here; the gateway checks the input when you submit.');
|
|
82
|
+
}
|
|
83
|
+
lines.push('', 'Pricing (USD; 68 credits ≈ $1):');
|
|
84
|
+
if (priced && priced.prices.length > 0) {
|
|
85
|
+
const groups = [['output', 'Main charge'], ['add_on', 'Extra charges'], ['token', 'Usage-based']];
|
|
86
|
+
for (const [role, label] of groups) {
|
|
87
|
+
const prices = priced.prices.filter(price => price.role === role);
|
|
88
|
+
if (prices.length === 0)
|
|
89
|
+
continue;
|
|
90
|
+
lines.push(`${label}:`);
|
|
91
|
+
for (const price of prices)
|
|
92
|
+
lines.push(`- ${priceLine(price)}`);
|
|
93
|
+
}
|
|
94
|
+
lines.push('Use estimate_cost with your input for a total before generating.');
|
|
95
|
+
structured.prices = priced.prices;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
lines.push(catalog.pricingWarning ?? 'No price is published for this model.');
|
|
99
|
+
}
|
|
100
|
+
if (catalog.pricingWarning)
|
|
101
|
+
structured.pricing_warning = catalog.pricingWarning;
|
|
102
|
+
return ok(lines.join('\n'), structured);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
return errorResult(error);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=get-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-model.js","sourceRoot":"","sources":["../../../../../core/src/tools/get-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ServerConfig } from '../config.js';
|
|
3
|
+
export declare const TASK_ID: RegExp;
|
|
4
|
+
/** Codex and Cursor drop a tool call after about 60 s; the reply also needs time to travel. */
|
|
5
|
+
export declare const MAX_WAIT_SECONDS = 45;
|
|
6
|
+
export declare function registerGetTask(server: McpServer, config: ServerConfig): void;
|
|
7
|
+
//# sourceMappingURL=get-task.d.ts.map
|
|
@@ -0,0 +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,CA2C7E"}
|