@runpod/mcp-server 4.0.0 → 4.1.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/CHANGELOG.md +30 -0
- package/README.md +6 -19
- package/dist/http.cjs +1200 -64
- package/dist/http.cjs.map +1 -1
- package/dist/http.mjs +1202 -64
- package/dist/http.mjs.map +1 -1
- package/dist/stdio.cjs +1200 -64
- package/dist/stdio.cjs.map +1 -1
- package/dist/stdio.mjs +1202 -64
- package/dist/stdio.mjs.map +1 -1
- package/package.json +3 -2
package/dist/stdio.mjs
CHANGED
|
@@ -11,7 +11,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
11
11
|
|
|
12
12
|
// src/server.ts
|
|
13
13
|
var SERVER_NAME = "Runpod API Server";
|
|
14
|
-
var SERVER_VERSION = true ? "4.
|
|
14
|
+
var SERVER_VERSION = true ? "4.1.0" : "dev";
|
|
15
15
|
|
|
16
16
|
// src/specgen/server.ts
|
|
17
17
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -269,6 +269,12 @@ var generatedTools = [
|
|
|
269
269
|
path: "/v2/clusters",
|
|
270
270
|
params: [],
|
|
271
271
|
hasBody: true,
|
|
272
|
+
annotations: {
|
|
273
|
+
readOnlyHint: false,
|
|
274
|
+
destructiveHint: false,
|
|
275
|
+
idempotentHint: false,
|
|
276
|
+
openWorldHint: true
|
|
277
|
+
},
|
|
272
278
|
inputSchema: {
|
|
273
279
|
type: "object",
|
|
274
280
|
properties: {
|
|
@@ -280,12 +286,34 @@ var generatedTools = [
|
|
|
280
286
|
$defs: {
|
|
281
287
|
BaseContainerConfig: {
|
|
282
288
|
type: "object",
|
|
283
|
-
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support
|
|
289
|
+
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support a direct registry credential (clusters \u2014 there the registry credential arrives via a pod template, see CreateClusterRequest.templateId).\n",
|
|
284
290
|
properties: {
|
|
285
291
|
args: {
|
|
286
292
|
type: "string",
|
|
287
|
-
description: "
|
|
288
|
-
examples: [
|
|
293
|
+
description: 'The container\'s command, as a single raw string. This is the field `entrypoint` and `cmd` encode into, exposed in its stored form.\n\nTwo shapes are accepted. A bare shell string is treated as CMD and split into arguments, which is what the console\'s "Container start command" field writes. A JSON object of the form `{"entrypoint":[...],"cmd":[...]}` sets either or both explicitly.\n\nResponses always return both representations: `args` exactly as stored, plus the deconstructed `entrypoint` and `cmd`. Supplying `args` together with `entrypoint` or `cmd` is allowed only when they describe the same command, so a read-modify-write client can send back everything it received. Send `""` to clear, omit to leave unchanged.\n',
|
|
294
|
+
examples: [
|
|
295
|
+
"--model meta-llama/Llama-3-8B --max-model-len 8192",
|
|
296
|
+
'{"entrypoint":["/bin/bash","-c"],"cmd":["python -u main.py"]}',
|
|
297
|
+
""
|
|
298
|
+
]
|
|
299
|
+
},
|
|
300
|
+
cmd: {
|
|
301
|
+
type: "array",
|
|
302
|
+
items: {
|
|
303
|
+
type: "string"
|
|
304
|
+
},
|
|
305
|
+
description: "Container CMD in exec form. When the image defines an ENTRYPOINT, this is the argument list passed to it. Encoded into the `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
306
|
+
examples: [
|
|
307
|
+
["--model", "meta-llama/Llama-3-8B", "--max-model-len", "8192"]
|
|
308
|
+
]
|
|
309
|
+
},
|
|
310
|
+
entrypoint: {
|
|
311
|
+
type: "array",
|
|
312
|
+
items: {
|
|
313
|
+
type: "string"
|
|
314
|
+
},
|
|
315
|
+
description: "Container ENTRYPOINT in exec form, overriding the image's own. Encoded into `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
316
|
+
examples: [["/bin/bash", "-c"]]
|
|
289
317
|
},
|
|
290
318
|
disk: {
|
|
291
319
|
type: "integer",
|
|
@@ -361,7 +389,7 @@ var generatedTools = [
|
|
|
361
389
|
{
|
|
362
390
|
type: "object",
|
|
363
391
|
required: ["name", "type", "compute"],
|
|
364
|
-
description: "Request body for creating a cluster. `compute` defines the\nhomogeneous pod shape; the container configuration (image, env, ports,\n\u2026) applies to every pod
|
|
392
|
+
description: "Request body for creating a cluster. `compute` defines the\nhomogeneous pod shape; the container configuration (image, env, ports,\n\u2026) applies to every pod. Pass `templateId` to provision every member\npod from a pod template instead of inline container fields \u2014 the\ntemplate also supplies the container registry credential, the only\nprivate-image path for clusters (a bare `registry` property on this\nbody is rejected).\n",
|
|
365
393
|
properties: {
|
|
366
394
|
compute: {
|
|
367
395
|
$ref: "#/$defs/ClusterCompute"
|
|
@@ -374,6 +402,12 @@ var generatedTools = [
|
|
|
374
402
|
type: {
|
|
375
403
|
$ref: "#/$defs/ClusterType"
|
|
376
404
|
},
|
|
405
|
+
templateId: {
|
|
406
|
+
type: "string",
|
|
407
|
+
minLength: 1,
|
|
408
|
+
description: "ID of a pod template to provision every member pod from. The\ntemplate supplies the container settings (image, args, disk,\nenv, ports) and the container registry credential for private\nimages \u2014 the only private-image path for clusters. Mutually\nexclusive with `image`, `args`, `entrypoint`, `cmd`, `disk`,\n`env`, `ports`, and `mounts` (rejected with 400). The cluster\nretains the link: the `template` response field is set. Must be\na non-serverless pod template accessible to the caller.\n",
|
|
409
|
+
examples: ["30zmvf89kd"]
|
|
410
|
+
},
|
|
377
411
|
dataCenterIds: {
|
|
378
412
|
type: "array",
|
|
379
413
|
items: {
|
|
@@ -465,6 +499,12 @@ var generatedTools = [
|
|
|
465
499
|
path: "/v2/registries/delegations",
|
|
466
500
|
params: [],
|
|
467
501
|
hasBody: true,
|
|
502
|
+
annotations: {
|
|
503
|
+
readOnlyHint: false,
|
|
504
|
+
destructiveHint: false,
|
|
505
|
+
idempotentHint: false,
|
|
506
|
+
openWorldHint: true
|
|
507
|
+
},
|
|
468
508
|
inputSchema: {
|
|
469
509
|
type: "object",
|
|
470
510
|
properties: {
|
|
@@ -504,6 +544,12 @@ var generatedTools = [
|
|
|
504
544
|
path: "/v2/serverless",
|
|
505
545
|
params: [],
|
|
506
546
|
hasBody: true,
|
|
547
|
+
annotations: {
|
|
548
|
+
readOnlyHint: false,
|
|
549
|
+
destructiveHint: false,
|
|
550
|
+
idempotentHint: false,
|
|
551
|
+
openWorldHint: true
|
|
552
|
+
},
|
|
507
553
|
inputSchema: {
|
|
508
554
|
type: "object",
|
|
509
555
|
properties: {
|
|
@@ -515,12 +561,34 @@ var generatedTools = [
|
|
|
515
561
|
$defs: {
|
|
516
562
|
BaseContainerConfig: {
|
|
517
563
|
type: "object",
|
|
518
|
-
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support
|
|
564
|
+
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support a direct registry credential (clusters \u2014 there the registry credential arrives via a pod template, see CreateClusterRequest.templateId).\n",
|
|
519
565
|
properties: {
|
|
520
566
|
args: {
|
|
521
567
|
type: "string",
|
|
522
|
-
description: "
|
|
523
|
-
examples: [
|
|
568
|
+
description: 'The container\'s command, as a single raw string. This is the field `entrypoint` and `cmd` encode into, exposed in its stored form.\n\nTwo shapes are accepted. A bare shell string is treated as CMD and split into arguments, which is what the console\'s "Container start command" field writes. A JSON object of the form `{"entrypoint":[...],"cmd":[...]}` sets either or both explicitly.\n\nResponses always return both representations: `args` exactly as stored, plus the deconstructed `entrypoint` and `cmd`. Supplying `args` together with `entrypoint` or `cmd` is allowed only when they describe the same command, so a read-modify-write client can send back everything it received. Send `""` to clear, omit to leave unchanged.\n',
|
|
569
|
+
examples: [
|
|
570
|
+
"--model meta-llama/Llama-3-8B --max-model-len 8192",
|
|
571
|
+
'{"entrypoint":["/bin/bash","-c"],"cmd":["python -u main.py"]}',
|
|
572
|
+
""
|
|
573
|
+
]
|
|
574
|
+
},
|
|
575
|
+
cmd: {
|
|
576
|
+
type: "array",
|
|
577
|
+
items: {
|
|
578
|
+
type: "string"
|
|
579
|
+
},
|
|
580
|
+
description: "Container CMD in exec form. When the image defines an ENTRYPOINT, this is the argument list passed to it. Encoded into the `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
581
|
+
examples: [
|
|
582
|
+
["--model", "meta-llama/Llama-3-8B", "--max-model-len", "8192"]
|
|
583
|
+
]
|
|
584
|
+
},
|
|
585
|
+
entrypoint: {
|
|
586
|
+
type: "array",
|
|
587
|
+
items: {
|
|
588
|
+
type: "string"
|
|
589
|
+
},
|
|
590
|
+
description: "Container ENTRYPOINT in exec form, overriding the image's own. Encoded into `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
591
|
+
examples: [["/bin/bash", "-c"]]
|
|
524
592
|
},
|
|
525
593
|
disk: {
|
|
526
594
|
type: "integer",
|
|
@@ -579,7 +647,7 @@ var generatedTools = [
|
|
|
579
647
|
pools: {
|
|
580
648
|
type: "array",
|
|
581
649
|
minItems: 1,
|
|
582
|
-
description:
|
|
650
|
+
description: 'Serverless GPU pool IDs (as returned by `GET /v2/catalog/gpus` in\n`pool`). Workers are placed on whichever listed pool has capacity.\nNarrow a pool down to specific cards with `excludedTypes`.\n\nOn `PATCH`, `pools` and `excludedTypes` are one selection and are\nreplaced together, so sending `pools` by itself **clears the\nexclusions**. Two cases:\n\n- **Changing pools, keeping exclusions** \u2014 send both fields in one\n request: `{"gpu": {"pools": ["ADA_24"], "excludedTypes":\n ["NVIDIA L40"]}}`. `GET` the endpoint first to read the current\n `excludedTypes` and resend the ones that still apply to the new\n pools; an exclusion naming a type outside `pools` is a 400.\n- **Changing only `count` or a CUDA constraint** \u2014 omit `pools`:\n `{"gpu": {"minCudaVersion": "12.4"}}`. The pool list and the\n exclusions are both left exactly as they are.\n\n`excludedTypes` documents the full rule.\n',
|
|
583
651
|
items: {
|
|
584
652
|
type: "string"
|
|
585
653
|
},
|
|
@@ -883,6 +951,12 @@ var generatedTools = [
|
|
|
883
951
|
path: "/v2/network-volumes",
|
|
884
952
|
params: [],
|
|
885
953
|
hasBody: true,
|
|
954
|
+
annotations: {
|
|
955
|
+
readOnlyHint: false,
|
|
956
|
+
destructiveHint: false,
|
|
957
|
+
idempotentHint: false,
|
|
958
|
+
openWorldHint: true
|
|
959
|
+
},
|
|
886
960
|
inputSchema: {
|
|
887
961
|
type: "object",
|
|
888
962
|
properties: {
|
|
@@ -942,6 +1016,12 @@ var generatedTools = [
|
|
|
942
1016
|
path: "/v2/pods",
|
|
943
1017
|
params: [],
|
|
944
1018
|
hasBody: true,
|
|
1019
|
+
annotations: {
|
|
1020
|
+
readOnlyHint: false,
|
|
1021
|
+
destructiveHint: false,
|
|
1022
|
+
idempotentHint: false,
|
|
1023
|
+
openWorldHint: true
|
|
1024
|
+
},
|
|
945
1025
|
inputSchema: {
|
|
946
1026
|
type: "object",
|
|
947
1027
|
properties: {
|
|
@@ -953,12 +1033,34 @@ var generatedTools = [
|
|
|
953
1033
|
$defs: {
|
|
954
1034
|
BaseContainerConfig: {
|
|
955
1035
|
type: "object",
|
|
956
|
-
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support
|
|
1036
|
+
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support a direct registry credential (clusters \u2014 there the registry credential arrives via a pod template, see CreateClusterRequest.templateId).\n",
|
|
957
1037
|
properties: {
|
|
958
1038
|
args: {
|
|
959
1039
|
type: "string",
|
|
960
|
-
description: "
|
|
961
|
-
examples: [
|
|
1040
|
+
description: 'The container\'s command, as a single raw string. This is the field `entrypoint` and `cmd` encode into, exposed in its stored form.\n\nTwo shapes are accepted. A bare shell string is treated as CMD and split into arguments, which is what the console\'s "Container start command" field writes. A JSON object of the form `{"entrypoint":[...],"cmd":[...]}` sets either or both explicitly.\n\nResponses always return both representations: `args` exactly as stored, plus the deconstructed `entrypoint` and `cmd`. Supplying `args` together with `entrypoint` or `cmd` is allowed only when they describe the same command, so a read-modify-write client can send back everything it received. Send `""` to clear, omit to leave unchanged.\n',
|
|
1041
|
+
examples: [
|
|
1042
|
+
"--model meta-llama/Llama-3-8B --max-model-len 8192",
|
|
1043
|
+
'{"entrypoint":["/bin/bash","-c"],"cmd":["python -u main.py"]}',
|
|
1044
|
+
""
|
|
1045
|
+
]
|
|
1046
|
+
},
|
|
1047
|
+
cmd: {
|
|
1048
|
+
type: "array",
|
|
1049
|
+
items: {
|
|
1050
|
+
type: "string"
|
|
1051
|
+
},
|
|
1052
|
+
description: "Container CMD in exec form. When the image defines an ENTRYPOINT, this is the argument list passed to it. Encoded into the `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
1053
|
+
examples: [
|
|
1054
|
+
["--model", "meta-llama/Llama-3-8B", "--max-model-len", "8192"]
|
|
1055
|
+
]
|
|
1056
|
+
},
|
|
1057
|
+
entrypoint: {
|
|
1058
|
+
type: "array",
|
|
1059
|
+
items: {
|
|
1060
|
+
type: "string"
|
|
1061
|
+
},
|
|
1062
|
+
description: "Container ENTRYPOINT in exec form, overriding the image's own. Encoded into `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
1063
|
+
examples: [["/bin/bash", "-c"]]
|
|
962
1064
|
},
|
|
963
1065
|
disk: {
|
|
964
1066
|
type: "integer",
|
|
@@ -1244,6 +1346,12 @@ var generatedTools = [
|
|
|
1244
1346
|
path: "/v2/registries",
|
|
1245
1347
|
params: [],
|
|
1246
1348
|
hasBody: true,
|
|
1349
|
+
annotations: {
|
|
1350
|
+
readOnlyHint: false,
|
|
1351
|
+
destructiveHint: false,
|
|
1352
|
+
idempotentHint: false,
|
|
1353
|
+
openWorldHint: true
|
|
1354
|
+
},
|
|
1247
1355
|
inputSchema: {
|
|
1248
1356
|
type: "object",
|
|
1249
1357
|
properties: {
|
|
@@ -1261,16 +1369,19 @@ var generatedTools = [
|
|
|
1261
1369
|
name: {
|
|
1262
1370
|
type: "string",
|
|
1263
1371
|
minLength: 1,
|
|
1372
|
+
maxLength: 191,
|
|
1264
1373
|
examples: ["my-private-registry"]
|
|
1265
1374
|
},
|
|
1266
1375
|
password: {
|
|
1267
1376
|
type: "string",
|
|
1268
1377
|
minLength: 1,
|
|
1378
|
+
maxLength: 16384,
|
|
1269
1379
|
description: "Registry password (write-only, not returned in responses)"
|
|
1270
1380
|
},
|
|
1271
1381
|
username: {
|
|
1272
1382
|
type: "string",
|
|
1273
1383
|
minLength: 1,
|
|
1384
|
+
maxLength: 191,
|
|
1274
1385
|
description: "Registry username (write-only, not returned in responses)"
|
|
1275
1386
|
}
|
|
1276
1387
|
}
|
|
@@ -1278,6 +1389,59 @@ var generatedTools = [
|
|
|
1278
1389
|
}
|
|
1279
1390
|
}
|
|
1280
1391
|
},
|
|
1392
|
+
{
|
|
1393
|
+
name: "create-secret",
|
|
1394
|
+
operationId: "createSecret",
|
|
1395
|
+
description: "Create a secret. Stores a new account-scoped encrypted string. `name` must be unique across the account's secrets and is immutable; `value` is write-only and can never be read back through the API. Use the secret from pods, serverless endpoints, and templates by setting an environment variable's value to `{{ RUNPOD_SECRET_<name> }}` \u2014 Runpod substitutes the stored value when the pod or worker boots. Returns `201` with the created secret's metadata, or `409` when the name is already taken.",
|
|
1396
|
+
method: "POST",
|
|
1397
|
+
path: "/v2/account/secrets",
|
|
1398
|
+
params: [],
|
|
1399
|
+
hasBody: true,
|
|
1400
|
+
annotations: {
|
|
1401
|
+
readOnlyHint: false,
|
|
1402
|
+
destructiveHint: false,
|
|
1403
|
+
idempotentHint: false,
|
|
1404
|
+
openWorldHint: true
|
|
1405
|
+
},
|
|
1406
|
+
inputSchema: {
|
|
1407
|
+
type: "object",
|
|
1408
|
+
properties: {
|
|
1409
|
+
body: {
|
|
1410
|
+
$ref: "#/$defs/CreateSecretRequest"
|
|
1411
|
+
}
|
|
1412
|
+
},
|
|
1413
|
+
required: ["body"],
|
|
1414
|
+
$defs: {
|
|
1415
|
+
CreateSecretRequest: {
|
|
1416
|
+
type: "object",
|
|
1417
|
+
additionalProperties: false,
|
|
1418
|
+
required: ["name", "value"],
|
|
1419
|
+
properties: {
|
|
1420
|
+
name: {
|
|
1421
|
+
type: "string",
|
|
1422
|
+
minLength: 1,
|
|
1423
|
+
maxLength: 191,
|
|
1424
|
+
pattern: "^[a-zA-Z_][a-zA-Z0-9_.\\-/]*$",
|
|
1425
|
+
description: "Unique name for the secret \u2014 referenced from environment variables as `{{ RUNPOD_SECRET_<name> }}`; immutable after creation. Maximum 191 characters, must start with a letter or underscore, and may contain letters, digits, and `_.-/`. Names beginning with the reserved prefix `RUNPOD` are rejected (case-insensitive).",
|
|
1426
|
+
examples: ["hf-token"]
|
|
1427
|
+
},
|
|
1428
|
+
value: {
|
|
1429
|
+
type: "string",
|
|
1430
|
+
minLength: 1,
|
|
1431
|
+
maxLength: 16777216,
|
|
1432
|
+
description: "The secret value. Write-only \u2014 never returned by the API. Must be smaller than 16 MiB of UTF-8 text (strictly under 16,777,216 bytes)."
|
|
1433
|
+
},
|
|
1434
|
+
description: {
|
|
1435
|
+
type: "string",
|
|
1436
|
+
maxLength: 65535,
|
|
1437
|
+
description: "Optional human-readable description, at most 65,535 bytes of UTF-8 text.",
|
|
1438
|
+
examples: ["Hugging Face read token"]
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
}
|
|
1443
|
+
}
|
|
1444
|
+
},
|
|
1281
1445
|
{
|
|
1282
1446
|
name: "create-template",
|
|
1283
1447
|
operationId: "createTemplate",
|
|
@@ -1286,6 +1450,12 @@ var generatedTools = [
|
|
|
1286
1450
|
path: "/v2/templates",
|
|
1287
1451
|
params: [],
|
|
1288
1452
|
hasBody: true,
|
|
1453
|
+
annotations: {
|
|
1454
|
+
readOnlyHint: false,
|
|
1455
|
+
destructiveHint: false,
|
|
1456
|
+
idempotentHint: false,
|
|
1457
|
+
openWorldHint: true
|
|
1458
|
+
},
|
|
1289
1459
|
inputSchema: {
|
|
1290
1460
|
type: "object",
|
|
1291
1461
|
properties: {
|
|
@@ -1297,12 +1467,34 @@ var generatedTools = [
|
|
|
1297
1467
|
$defs: {
|
|
1298
1468
|
BaseContainerConfig: {
|
|
1299
1469
|
type: "object",
|
|
1300
|
-
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support
|
|
1470
|
+
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support a direct registry credential (clusters \u2014 there the registry credential arrives via a pod template, see CreateClusterRequest.templateId).\n",
|
|
1301
1471
|
properties: {
|
|
1302
1472
|
args: {
|
|
1303
1473
|
type: "string",
|
|
1304
|
-
description: "
|
|
1305
|
-
examples: [
|
|
1474
|
+
description: 'The container\'s command, as a single raw string. This is the field `entrypoint` and `cmd` encode into, exposed in its stored form.\n\nTwo shapes are accepted. A bare shell string is treated as CMD and split into arguments, which is what the console\'s "Container start command" field writes. A JSON object of the form `{"entrypoint":[...],"cmd":[...]}` sets either or both explicitly.\n\nResponses always return both representations: `args` exactly as stored, plus the deconstructed `entrypoint` and `cmd`. Supplying `args` together with `entrypoint` or `cmd` is allowed only when they describe the same command, so a read-modify-write client can send back everything it received. Send `""` to clear, omit to leave unchanged.\n',
|
|
1475
|
+
examples: [
|
|
1476
|
+
"--model meta-llama/Llama-3-8B --max-model-len 8192",
|
|
1477
|
+
'{"entrypoint":["/bin/bash","-c"],"cmd":["python -u main.py"]}',
|
|
1478
|
+
""
|
|
1479
|
+
]
|
|
1480
|
+
},
|
|
1481
|
+
cmd: {
|
|
1482
|
+
type: "array",
|
|
1483
|
+
items: {
|
|
1484
|
+
type: "string"
|
|
1485
|
+
},
|
|
1486
|
+
description: "Container CMD in exec form. When the image defines an ENTRYPOINT, this is the argument list passed to it. Encoded into the `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
1487
|
+
examples: [
|
|
1488
|
+
["--model", "meta-llama/Llama-3-8B", "--max-model-len", "8192"]
|
|
1489
|
+
]
|
|
1490
|
+
},
|
|
1491
|
+
entrypoint: {
|
|
1492
|
+
type: "array",
|
|
1493
|
+
items: {
|
|
1494
|
+
type: "string"
|
|
1495
|
+
},
|
|
1496
|
+
description: "Container ENTRYPOINT in exec form, overriding the image's own. Encoded into `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
1497
|
+
examples: [["/bin/bash", "-c"]]
|
|
1306
1498
|
},
|
|
1307
1499
|
disk: {
|
|
1308
1500
|
type: "integer",
|
|
@@ -1465,6 +1657,12 @@ var generatedTools = [
|
|
|
1465
1657
|
}
|
|
1466
1658
|
],
|
|
1467
1659
|
hasBody: false,
|
|
1660
|
+
annotations: {
|
|
1661
|
+
readOnlyHint: false,
|
|
1662
|
+
destructiveHint: true,
|
|
1663
|
+
idempotentHint: true,
|
|
1664
|
+
openWorldHint: true
|
|
1665
|
+
},
|
|
1468
1666
|
inputSchema: {
|
|
1469
1667
|
type: "object",
|
|
1470
1668
|
properties: {
|
|
@@ -1489,6 +1687,12 @@ var generatedTools = [
|
|
|
1489
1687
|
}
|
|
1490
1688
|
],
|
|
1491
1689
|
hasBody: false,
|
|
1690
|
+
annotations: {
|
|
1691
|
+
readOnlyHint: false,
|
|
1692
|
+
destructiveHint: true,
|
|
1693
|
+
idempotentHint: true,
|
|
1694
|
+
openWorldHint: true
|
|
1695
|
+
},
|
|
1492
1696
|
inputSchema: {
|
|
1493
1697
|
type: "object",
|
|
1494
1698
|
properties: {
|
|
@@ -1513,6 +1717,12 @@ var generatedTools = [
|
|
|
1513
1717
|
}
|
|
1514
1718
|
],
|
|
1515
1719
|
hasBody: false,
|
|
1720
|
+
annotations: {
|
|
1721
|
+
readOnlyHint: false,
|
|
1722
|
+
destructiveHint: true,
|
|
1723
|
+
idempotentHint: true,
|
|
1724
|
+
openWorldHint: true
|
|
1725
|
+
},
|
|
1516
1726
|
inputSchema: {
|
|
1517
1727
|
type: "object",
|
|
1518
1728
|
properties: {
|
|
@@ -1537,6 +1747,12 @@ var generatedTools = [
|
|
|
1537
1747
|
}
|
|
1538
1748
|
],
|
|
1539
1749
|
hasBody: false,
|
|
1750
|
+
annotations: {
|
|
1751
|
+
readOnlyHint: false,
|
|
1752
|
+
destructiveHint: true,
|
|
1753
|
+
idempotentHint: true,
|
|
1754
|
+
openWorldHint: true
|
|
1755
|
+
},
|
|
1540
1756
|
inputSchema: {
|
|
1541
1757
|
type: "object",
|
|
1542
1758
|
properties: {
|
|
@@ -1561,6 +1777,12 @@ var generatedTools = [
|
|
|
1561
1777
|
}
|
|
1562
1778
|
],
|
|
1563
1779
|
hasBody: false,
|
|
1780
|
+
annotations: {
|
|
1781
|
+
readOnlyHint: false,
|
|
1782
|
+
destructiveHint: true,
|
|
1783
|
+
idempotentHint: true,
|
|
1784
|
+
openWorldHint: true
|
|
1785
|
+
},
|
|
1564
1786
|
inputSchema: {
|
|
1565
1787
|
type: "object",
|
|
1566
1788
|
properties: {
|
|
@@ -1571,6 +1793,36 @@ var generatedTools = [
|
|
|
1571
1793
|
required: ["id"]
|
|
1572
1794
|
}
|
|
1573
1795
|
},
|
|
1796
|
+
{
|
|
1797
|
+
name: "delete-secret",
|
|
1798
|
+
operationId: "deleteSecret",
|
|
1799
|
+
description: "Delete a secret. Permanently deletes a secret. Environment variables referencing the deleted secret's name will no longer resolve to a value.",
|
|
1800
|
+
method: "DELETE",
|
|
1801
|
+
path: "/v2/account/secrets/{id}",
|
|
1802
|
+
params: [
|
|
1803
|
+
{
|
|
1804
|
+
name: "id",
|
|
1805
|
+
location: "path"
|
|
1806
|
+
}
|
|
1807
|
+
],
|
|
1808
|
+
hasBody: false,
|
|
1809
|
+
annotations: {
|
|
1810
|
+
readOnlyHint: false,
|
|
1811
|
+
destructiveHint: true,
|
|
1812
|
+
idempotentHint: true,
|
|
1813
|
+
openWorldHint: true
|
|
1814
|
+
},
|
|
1815
|
+
inputSchema: {
|
|
1816
|
+
type: "object",
|
|
1817
|
+
properties: {
|
|
1818
|
+
id: {
|
|
1819
|
+
type: "string",
|
|
1820
|
+
description: "Secret identifier"
|
|
1821
|
+
}
|
|
1822
|
+
},
|
|
1823
|
+
required: ["id"]
|
|
1824
|
+
}
|
|
1825
|
+
},
|
|
1574
1826
|
{
|
|
1575
1827
|
name: "delete-template",
|
|
1576
1828
|
operationId: "deleteTemplate",
|
|
@@ -1584,6 +1836,12 @@ var generatedTools = [
|
|
|
1584
1836
|
}
|
|
1585
1837
|
],
|
|
1586
1838
|
hasBody: false,
|
|
1839
|
+
annotations: {
|
|
1840
|
+
readOnlyHint: false,
|
|
1841
|
+
destructiveHint: true,
|
|
1842
|
+
idempotentHint: true,
|
|
1843
|
+
openWorldHint: true
|
|
1844
|
+
},
|
|
1587
1845
|
inputSchema: {
|
|
1588
1846
|
type: "object",
|
|
1589
1847
|
properties: {
|
|
@@ -1607,6 +1865,12 @@ var generatedTools = [
|
|
|
1607
1865
|
}
|
|
1608
1866
|
],
|
|
1609
1867
|
hasBody: false,
|
|
1868
|
+
annotations: {
|
|
1869
|
+
readOnlyHint: true,
|
|
1870
|
+
destructiveHint: false,
|
|
1871
|
+
idempotentHint: true,
|
|
1872
|
+
openWorldHint: true
|
|
1873
|
+
},
|
|
1610
1874
|
inputSchema: {
|
|
1611
1875
|
type: "object",
|
|
1612
1876
|
properties: {
|
|
@@ -1645,6 +1909,12 @@ var generatedTools = [
|
|
|
1645
1909
|
}
|
|
1646
1910
|
],
|
|
1647
1911
|
hasBody: false,
|
|
1912
|
+
annotations: {
|
|
1913
|
+
readOnlyHint: true,
|
|
1914
|
+
destructiveHint: false,
|
|
1915
|
+
idempotentHint: true,
|
|
1916
|
+
openWorldHint: true
|
|
1917
|
+
},
|
|
1648
1918
|
inputSchema: {
|
|
1649
1919
|
type: "object",
|
|
1650
1920
|
properties: {
|
|
@@ -1706,6 +1976,12 @@ var generatedTools = [
|
|
|
1706
1976
|
}
|
|
1707
1977
|
],
|
|
1708
1978
|
hasBody: false,
|
|
1979
|
+
annotations: {
|
|
1980
|
+
readOnlyHint: true,
|
|
1981
|
+
destructiveHint: false,
|
|
1982
|
+
idempotentHint: true,
|
|
1983
|
+
openWorldHint: true
|
|
1984
|
+
},
|
|
1709
1985
|
inputSchema: {
|
|
1710
1986
|
type: "object",
|
|
1711
1987
|
properties: {
|
|
@@ -1744,6 +2020,12 @@ var generatedTools = [
|
|
|
1744
2020
|
}
|
|
1745
2021
|
],
|
|
1746
2022
|
hasBody: false,
|
|
2023
|
+
annotations: {
|
|
2024
|
+
readOnlyHint: true,
|
|
2025
|
+
destructiveHint: false,
|
|
2026
|
+
idempotentHint: true,
|
|
2027
|
+
openWorldHint: true
|
|
2028
|
+
},
|
|
1747
2029
|
inputSchema: {
|
|
1748
2030
|
type: "object",
|
|
1749
2031
|
properties: {
|
|
@@ -1758,7 +2040,7 @@ var generatedTools = [
|
|
|
1758
2040
|
{
|
|
1759
2041
|
name: "get-endpoint-build",
|
|
1760
2042
|
operationId: "getEndpointBuild",
|
|
1761
|
-
description: "Get a serverless endpoint build. Returns one of the endpoint's GitHub builds by id, regardless of age \u2014
|
|
2043
|
+
description: "Get a serverless endpoint build. Returns one of the endpoint's GitHub builds by id, regardless of age \u2014 no need to page through `GET /v2/serverless/{id}/builds` to reach it.",
|
|
1762
2044
|
method: "GET",
|
|
1763
2045
|
path: "/v2/serverless/{id}/builds/{buildId}",
|
|
1764
2046
|
params: [
|
|
@@ -1772,6 +2054,12 @@ var generatedTools = [
|
|
|
1772
2054
|
}
|
|
1773
2055
|
],
|
|
1774
2056
|
hasBody: false,
|
|
2057
|
+
annotations: {
|
|
2058
|
+
readOnlyHint: true,
|
|
2059
|
+
destructiveHint: false,
|
|
2060
|
+
idempotentHint: true,
|
|
2061
|
+
openWorldHint: true
|
|
2062
|
+
},
|
|
1775
2063
|
inputSchema: {
|
|
1776
2064
|
type: "object",
|
|
1777
2065
|
properties: {
|
|
@@ -1832,6 +2120,12 @@ var generatedTools = [
|
|
|
1832
2120
|
}
|
|
1833
2121
|
],
|
|
1834
2122
|
hasBody: false,
|
|
2123
|
+
annotations: {
|
|
2124
|
+
readOnlyHint: true,
|
|
2125
|
+
destructiveHint: false,
|
|
2126
|
+
idempotentHint: true,
|
|
2127
|
+
openWorldHint: true
|
|
2128
|
+
},
|
|
1835
2129
|
inputSchema: {
|
|
1836
2130
|
type: "object",
|
|
1837
2131
|
properties: {
|
|
@@ -1918,6 +2212,12 @@ var generatedTools = [
|
|
|
1918
2212
|
}
|
|
1919
2213
|
],
|
|
1920
2214
|
hasBody: false,
|
|
2215
|
+
annotations: {
|
|
2216
|
+
readOnlyHint: true,
|
|
2217
|
+
destructiveHint: false,
|
|
2218
|
+
idempotentHint: true,
|
|
2219
|
+
openWorldHint: true
|
|
2220
|
+
},
|
|
1921
2221
|
inputSchema: {
|
|
1922
2222
|
type: "object",
|
|
1923
2223
|
properties: {
|
|
@@ -1942,6 +2242,12 @@ var generatedTools = [
|
|
|
1942
2242
|
}
|
|
1943
2243
|
],
|
|
1944
2244
|
hasBody: false,
|
|
2245
|
+
annotations: {
|
|
2246
|
+
readOnlyHint: true,
|
|
2247
|
+
destructiveHint: false,
|
|
2248
|
+
idempotentHint: true,
|
|
2249
|
+
openWorldHint: true
|
|
2250
|
+
},
|
|
1945
2251
|
inputSchema: {
|
|
1946
2252
|
type: "object",
|
|
1947
2253
|
properties: {
|
|
@@ -1966,6 +2272,12 @@ var generatedTools = [
|
|
|
1966
2272
|
}
|
|
1967
2273
|
],
|
|
1968
2274
|
hasBody: false,
|
|
2275
|
+
annotations: {
|
|
2276
|
+
readOnlyHint: true,
|
|
2277
|
+
destructiveHint: false,
|
|
2278
|
+
idempotentHint: true,
|
|
2279
|
+
openWorldHint: true
|
|
2280
|
+
},
|
|
1969
2281
|
inputSchema: {
|
|
1970
2282
|
type: "object",
|
|
1971
2283
|
properties: {
|
|
@@ -1976,6 +2288,36 @@ var generatedTools = [
|
|
|
1976
2288
|
required: ["id"]
|
|
1977
2289
|
}
|
|
1978
2290
|
},
|
|
2291
|
+
{
|
|
2292
|
+
name: "get-secret",
|
|
2293
|
+
operationId: "getSecret",
|
|
2294
|
+
description: "Get a secret. Returns a single secret's metadata by ID. The value is write-only and never returned.",
|
|
2295
|
+
method: "GET",
|
|
2296
|
+
path: "/v2/account/secrets/{id}",
|
|
2297
|
+
params: [
|
|
2298
|
+
{
|
|
2299
|
+
name: "id",
|
|
2300
|
+
location: "path"
|
|
2301
|
+
}
|
|
2302
|
+
],
|
|
2303
|
+
hasBody: false,
|
|
2304
|
+
annotations: {
|
|
2305
|
+
readOnlyHint: true,
|
|
2306
|
+
destructiveHint: false,
|
|
2307
|
+
idempotentHint: true,
|
|
2308
|
+
openWorldHint: true
|
|
2309
|
+
},
|
|
2310
|
+
inputSchema: {
|
|
2311
|
+
type: "object",
|
|
2312
|
+
properties: {
|
|
2313
|
+
id: {
|
|
2314
|
+
type: "string",
|
|
2315
|
+
description: "Secret identifier"
|
|
2316
|
+
}
|
|
2317
|
+
},
|
|
2318
|
+
required: ["id"]
|
|
2319
|
+
}
|
|
2320
|
+
},
|
|
1979
2321
|
{
|
|
1980
2322
|
name: "get-ssh-keys",
|
|
1981
2323
|
operationId: "getSshKeys",
|
|
@@ -1984,6 +2326,12 @@ var generatedTools = [
|
|
|
1984
2326
|
path: "/v2/account/ssh-keys",
|
|
1985
2327
|
params: [],
|
|
1986
2328
|
hasBody: false,
|
|
2329
|
+
annotations: {
|
|
2330
|
+
readOnlyHint: true,
|
|
2331
|
+
destructiveHint: false,
|
|
2332
|
+
idempotentHint: true,
|
|
2333
|
+
openWorldHint: true
|
|
2334
|
+
},
|
|
1987
2335
|
inputSchema: {
|
|
1988
2336
|
type: "object",
|
|
1989
2337
|
properties: {}
|
|
@@ -2002,6 +2350,12 @@ var generatedTools = [
|
|
|
2002
2350
|
}
|
|
2003
2351
|
],
|
|
2004
2352
|
hasBody: false,
|
|
2353
|
+
annotations: {
|
|
2354
|
+
readOnlyHint: true,
|
|
2355
|
+
destructiveHint: false,
|
|
2356
|
+
idempotentHint: true,
|
|
2357
|
+
openWorldHint: true
|
|
2358
|
+
},
|
|
2005
2359
|
inputSchema: {
|
|
2006
2360
|
type: "object",
|
|
2007
2361
|
properties: {
|
|
@@ -2037,6 +2391,12 @@ var generatedTools = [
|
|
|
2037
2391
|
}
|
|
2038
2392
|
],
|
|
2039
2393
|
hasBody: false,
|
|
2394
|
+
annotations: {
|
|
2395
|
+
readOnlyHint: true,
|
|
2396
|
+
destructiveHint: false,
|
|
2397
|
+
idempotentHint: true,
|
|
2398
|
+
openWorldHint: true
|
|
2399
|
+
},
|
|
2040
2400
|
inputSchema: {
|
|
2041
2401
|
type: "object",
|
|
2042
2402
|
properties: {
|
|
@@ -2107,6 +2467,12 @@ var generatedTools = [
|
|
|
2107
2467
|
}
|
|
2108
2468
|
],
|
|
2109
2469
|
hasBody: false,
|
|
2470
|
+
annotations: {
|
|
2471
|
+
readOnlyHint: true,
|
|
2472
|
+
destructiveHint: false,
|
|
2473
|
+
idempotentHint: true,
|
|
2474
|
+
openWorldHint: true
|
|
2475
|
+
},
|
|
2110
2476
|
inputSchema: {
|
|
2111
2477
|
type: "object",
|
|
2112
2478
|
properties: {
|
|
@@ -2165,6 +2531,12 @@ var generatedTools = [
|
|
|
2165
2531
|
}
|
|
2166
2532
|
],
|
|
2167
2533
|
hasBody: false,
|
|
2534
|
+
annotations: {
|
|
2535
|
+
readOnlyHint: true,
|
|
2536
|
+
destructiveHint: false,
|
|
2537
|
+
idempotentHint: true,
|
|
2538
|
+
openWorldHint: true
|
|
2539
|
+
},
|
|
2168
2540
|
inputSchema: {
|
|
2169
2541
|
type: "object",
|
|
2170
2542
|
properties: {
|
|
@@ -2184,6 +2556,12 @@ var generatedTools = [
|
|
|
2184
2556
|
path: "/v2/clusters",
|
|
2185
2557
|
params: [],
|
|
2186
2558
|
hasBody: false,
|
|
2559
|
+
annotations: {
|
|
2560
|
+
readOnlyHint: true,
|
|
2561
|
+
destructiveHint: false,
|
|
2562
|
+
idempotentHint: true,
|
|
2563
|
+
openWorldHint: true
|
|
2564
|
+
},
|
|
2187
2565
|
inputSchema: {
|
|
2188
2566
|
type: "object",
|
|
2189
2567
|
properties: {}
|
|
@@ -2212,6 +2590,12 @@ var generatedTools = [
|
|
|
2212
2590
|
}
|
|
2213
2591
|
],
|
|
2214
2592
|
hasBody: false,
|
|
2593
|
+
annotations: {
|
|
2594
|
+
readOnlyHint: true,
|
|
2595
|
+
destructiveHint: false,
|
|
2596
|
+
idempotentHint: true,
|
|
2597
|
+
openWorldHint: true
|
|
2598
|
+
},
|
|
2215
2599
|
inputSchema: {
|
|
2216
2600
|
type: "object",
|
|
2217
2601
|
properties: {
|
|
@@ -2284,6 +2668,12 @@ var generatedTools = [
|
|
|
2284
2668
|
}
|
|
2285
2669
|
],
|
|
2286
2670
|
hasBody: false,
|
|
2671
|
+
annotations: {
|
|
2672
|
+
readOnlyHint: true,
|
|
2673
|
+
destructiveHint: false,
|
|
2674
|
+
idempotentHint: true,
|
|
2675
|
+
openWorldHint: true
|
|
2676
|
+
},
|
|
2287
2677
|
inputSchema: {
|
|
2288
2678
|
type: "object",
|
|
2289
2679
|
properties: {
|
|
@@ -2380,6 +2770,12 @@ var generatedTools = [
|
|
|
2380
2770
|
path: "/v2/registries/delegations",
|
|
2381
2771
|
params: [],
|
|
2382
2772
|
hasBody: false,
|
|
2773
|
+
annotations: {
|
|
2774
|
+
readOnlyHint: true,
|
|
2775
|
+
destructiveHint: false,
|
|
2776
|
+
idempotentHint: true,
|
|
2777
|
+
openWorldHint: true
|
|
2778
|
+
},
|
|
2383
2779
|
inputSchema: {
|
|
2384
2780
|
type: "object",
|
|
2385
2781
|
properties: {}
|
|
@@ -2410,6 +2806,12 @@ var generatedTools = [
|
|
|
2410
2806
|
}
|
|
2411
2807
|
],
|
|
2412
2808
|
hasBody: false,
|
|
2809
|
+
annotations: {
|
|
2810
|
+
readOnlyHint: true,
|
|
2811
|
+
destructiveHint: false,
|
|
2812
|
+
idempotentHint: true,
|
|
2813
|
+
openWorldHint: true
|
|
2814
|
+
},
|
|
2413
2815
|
inputSchema: {
|
|
2414
2816
|
type: "object",
|
|
2415
2817
|
properties: {
|
|
@@ -2454,22 +2856,47 @@ var generatedTools = [
|
|
|
2454
2856
|
{
|
|
2455
2857
|
name: "list-endpoint-builds",
|
|
2456
2858
|
operationId: "listEndpointBuilds",
|
|
2457
|
-
description: "List serverless endpoint builds. Returns the endpoint's GitHub build history, newest first (Runpod GitHub-build integration)
|
|
2859
|
+
description: "List serverless endpoint builds. Returns the endpoint's GitHub build history, newest first (Runpod GitHub-build integration), cursor-paginated; an omitted `limit` defaults to 100, so a bare request returns at most the 100 most recent builds. Any build can also be fetched by id via `GET /v2/serverless/{id}/builds/{buildId}`. Stream a build's logs via `/v2/serverless/{id}/builds/{buildId}/logs`.",
|
|
2458
2860
|
method: "GET",
|
|
2459
2861
|
path: "/v2/serverless/{id}/builds",
|
|
2460
2862
|
params: [
|
|
2461
2863
|
{
|
|
2462
2864
|
name: "id",
|
|
2463
2865
|
location: "path"
|
|
2866
|
+
},
|
|
2867
|
+
{
|
|
2868
|
+
name: "cursor",
|
|
2869
|
+
location: "query"
|
|
2870
|
+
},
|
|
2871
|
+
{
|
|
2872
|
+
name: "limit",
|
|
2873
|
+
location: "query"
|
|
2464
2874
|
}
|
|
2465
2875
|
],
|
|
2466
2876
|
hasBody: false,
|
|
2877
|
+
annotations: {
|
|
2878
|
+
readOnlyHint: true,
|
|
2879
|
+
destructiveHint: false,
|
|
2880
|
+
idempotentHint: true,
|
|
2881
|
+
openWorldHint: true
|
|
2882
|
+
},
|
|
2467
2883
|
inputSchema: {
|
|
2468
2884
|
type: "object",
|
|
2469
2885
|
properties: {
|
|
2470
2886
|
id: {
|
|
2471
2887
|
type: "string",
|
|
2472
2888
|
description: "Serverless endpoint identifier"
|
|
2889
|
+
},
|
|
2890
|
+
cursor: {
|
|
2891
|
+
type: "string",
|
|
2892
|
+
minLength: 1,
|
|
2893
|
+
description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected with 422.\n"
|
|
2894
|
+
},
|
|
2895
|
+
limit: {
|
|
2896
|
+
type: "integer",
|
|
2897
|
+
minimum: 1,
|
|
2898
|
+
maximum: 100,
|
|
2899
|
+
description: "Page size, 1\u2013100. Defaults to 100 when omitted."
|
|
2473
2900
|
}
|
|
2474
2901
|
},
|
|
2475
2902
|
required: ["id"]
|
|
@@ -2478,22 +2905,47 @@ var generatedTools = [
|
|
|
2478
2905
|
{
|
|
2479
2906
|
name: "list-endpoint-releases",
|
|
2480
2907
|
operationId: "listEndpointReleases",
|
|
2481
|
-
description: "List serverless endpoint releases. Returns the endpoint's release history (newest first) plus a rollout summary of how many workers are running the current version. Each release is a versioned configuration snapshot with a `diff` of what changed; build-driven releases carry a `buildId` (fetch build detail via the builds sub-routes).",
|
|
2908
|
+
description: "List serverless endpoint releases. Returns the endpoint's release history (newest first) plus a rollout summary of how many workers are running the current version. Each release is a versioned configuration snapshot with a `diff` of what changed; build-driven releases carry a `buildId` (fetch build detail via the builds sub-routes). Releases are cursor-paginated newest-first; an omitted `limit` defaults to 1000. The rollout summary always describes the endpoint's current state, independent of the page requested.",
|
|
2482
2909
|
method: "GET",
|
|
2483
2910
|
path: "/v2/serverless/{id}/releases",
|
|
2484
2911
|
params: [
|
|
2485
2912
|
{
|
|
2486
2913
|
name: "id",
|
|
2487
2914
|
location: "path"
|
|
2915
|
+
},
|
|
2916
|
+
{
|
|
2917
|
+
name: "cursor",
|
|
2918
|
+
location: "query"
|
|
2919
|
+
},
|
|
2920
|
+
{
|
|
2921
|
+
name: "limit",
|
|
2922
|
+
location: "query"
|
|
2488
2923
|
}
|
|
2489
2924
|
],
|
|
2490
2925
|
hasBody: false,
|
|
2926
|
+
annotations: {
|
|
2927
|
+
readOnlyHint: true,
|
|
2928
|
+
destructiveHint: false,
|
|
2929
|
+
idempotentHint: true,
|
|
2930
|
+
openWorldHint: true
|
|
2931
|
+
},
|
|
2491
2932
|
inputSchema: {
|
|
2492
2933
|
type: "object",
|
|
2493
2934
|
properties: {
|
|
2494
2935
|
id: {
|
|
2495
2936
|
type: "string",
|
|
2496
2937
|
description: "Serverless endpoint identifier"
|
|
2938
|
+
},
|
|
2939
|
+
cursor: {
|
|
2940
|
+
type: "string",
|
|
2941
|
+
minLength: 1,
|
|
2942
|
+
description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected with 422.\n"
|
|
2943
|
+
},
|
|
2944
|
+
limit: {
|
|
2945
|
+
type: "integer",
|
|
2946
|
+
minimum: 1,
|
|
2947
|
+
maximum: 1e3,
|
|
2948
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
2497
2949
|
}
|
|
2498
2950
|
},
|
|
2499
2951
|
required: ["id"]
|
|
@@ -2512,6 +2964,12 @@ var generatedTools = [
|
|
|
2512
2964
|
}
|
|
2513
2965
|
],
|
|
2514
2966
|
hasBody: false,
|
|
2967
|
+
annotations: {
|
|
2968
|
+
readOnlyHint: true,
|
|
2969
|
+
destructiveHint: false,
|
|
2970
|
+
idempotentHint: true,
|
|
2971
|
+
openWorldHint: true
|
|
2972
|
+
},
|
|
2515
2973
|
inputSchema: {
|
|
2516
2974
|
type: "object",
|
|
2517
2975
|
properties: {
|
|
@@ -2564,6 +3022,12 @@ var generatedTools = [
|
|
|
2564
3022
|
}
|
|
2565
3023
|
],
|
|
2566
3024
|
hasBody: false,
|
|
3025
|
+
annotations: {
|
|
3026
|
+
readOnlyHint: true,
|
|
3027
|
+
destructiveHint: false,
|
|
3028
|
+
idempotentHint: true,
|
|
3029
|
+
openWorldHint: true
|
|
3030
|
+
},
|
|
2567
3031
|
inputSchema: {
|
|
2568
3032
|
type: "object",
|
|
2569
3033
|
properties: {
|
|
@@ -2662,6 +3126,12 @@ var generatedTools = [
|
|
|
2662
3126
|
}
|
|
2663
3127
|
],
|
|
2664
3128
|
hasBody: false,
|
|
3129
|
+
annotations: {
|
|
3130
|
+
readOnlyHint: true,
|
|
3131
|
+
destructiveHint: false,
|
|
3132
|
+
idempotentHint: true,
|
|
3133
|
+
openWorldHint: true
|
|
3134
|
+
},
|
|
2665
3135
|
inputSchema: {
|
|
2666
3136
|
type: "object",
|
|
2667
3137
|
properties: {
|
|
@@ -2715,6 +3185,12 @@ var generatedTools = [
|
|
|
2715
3185
|
path: "/v2/network-volumes",
|
|
2716
3186
|
params: [],
|
|
2717
3187
|
hasBody: false,
|
|
3188
|
+
annotations: {
|
|
3189
|
+
readOnlyHint: true,
|
|
3190
|
+
destructiveHint: false,
|
|
3191
|
+
idempotentHint: true,
|
|
3192
|
+
openWorldHint: true
|
|
3193
|
+
},
|
|
2718
3194
|
inputSchema: {
|
|
2719
3195
|
type: "object",
|
|
2720
3196
|
properties: {}
|
|
@@ -2749,6 +3225,12 @@ var generatedTools = [
|
|
|
2749
3225
|
}
|
|
2750
3226
|
],
|
|
2751
3227
|
hasBody: false,
|
|
3228
|
+
annotations: {
|
|
3229
|
+
readOnlyHint: true,
|
|
3230
|
+
destructiveHint: false,
|
|
3231
|
+
idempotentHint: true,
|
|
3232
|
+
openWorldHint: true
|
|
3233
|
+
},
|
|
2752
3234
|
inputSchema: {
|
|
2753
3235
|
type: "object",
|
|
2754
3236
|
properties: {
|
|
@@ -2797,16 +3279,30 @@ var generatedTools = [
|
|
|
2797
3279
|
{
|
|
2798
3280
|
name: "list-pods",
|
|
2799
3281
|
operationId: "listPods",
|
|
2800
|
-
description: "List pods. Returns pods owned by the authenticated user. Cluster member pods are excluded by default; set `includeClusterPods=true` to include them (each carries a non-null `cluster` membership block).",
|
|
3282
|
+
description: "List pods. Returns pods owned by the authenticated user. Cluster member pods are excluded by default; set `includeClusterPods=true` to include them (each carries a non-null `cluster` membership block). Results are cursor-paginated newest-first; an omitted `limit` defaults to 1000. When cluster member pods are excluded, the exclusion applies to each page after it is cut, so a page may hold fewer than `limit` pods \u2014 follow `pagination.nextCursor` until `hasNextPage` is false rather than counting items.",
|
|
2801
3283
|
method: "GET",
|
|
2802
3284
|
path: "/v2/pods",
|
|
2803
3285
|
params: [
|
|
2804
3286
|
{
|
|
2805
3287
|
name: "includeClusterPods",
|
|
2806
3288
|
location: "query"
|
|
3289
|
+
},
|
|
3290
|
+
{
|
|
3291
|
+
name: "cursor",
|
|
3292
|
+
location: "query"
|
|
3293
|
+
},
|
|
3294
|
+
{
|
|
3295
|
+
name: "limit",
|
|
3296
|
+
location: "query"
|
|
2807
3297
|
}
|
|
2808
3298
|
],
|
|
2809
3299
|
hasBody: false,
|
|
3300
|
+
annotations: {
|
|
3301
|
+
readOnlyHint: true,
|
|
3302
|
+
destructiveHint: false,
|
|
3303
|
+
idempotentHint: true,
|
|
3304
|
+
openWorldHint: true
|
|
3305
|
+
},
|
|
2810
3306
|
inputSchema: {
|
|
2811
3307
|
type: "object",
|
|
2812
3308
|
properties: {
|
|
@@ -2814,6 +3310,17 @@ var generatedTools = [
|
|
|
2814
3310
|
type: "boolean",
|
|
2815
3311
|
default: false,
|
|
2816
3312
|
description: "Include cluster member pods in the result. Defaults to false."
|
|
3313
|
+
},
|
|
3314
|
+
cursor: {
|
|
3315
|
+
type: "string",
|
|
3316
|
+
minLength: 1,
|
|
3317
|
+
description: "Opaque resume cursor \u2014 pass the previous response's `pagination.nextCursor` through verbatim; omit for the first page. A cursor is only valid for the operation and parameters that issued it; a malformed or foreign cursor is rejected with 422.\n"
|
|
3318
|
+
},
|
|
3319
|
+
limit: {
|
|
3320
|
+
type: "integer",
|
|
3321
|
+
minimum: 1,
|
|
3322
|
+
maximum: 1e3,
|
|
3323
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
2817
3324
|
}
|
|
2818
3325
|
}
|
|
2819
3326
|
}
|
|
@@ -2821,7 +3328,7 @@ var generatedTools = [
|
|
|
2821
3328
|
{
|
|
2822
3329
|
name: "list-public-templates",
|
|
2823
3330
|
operationId: "listPublicTemplates",
|
|
2824
|
-
description: "List public templates. Returns the public template catalog. `source` selects which slice: `official` (the default) is Runpod-curated templates, `verified` is community templates Runpod has verified, and `community` is everything else other users have shared publicly. Both pod and serverless templates appear \u2014 use each entry's `serverless` flag to tell them apart. `registry` is always null for templates you don't own. Your own templates (public or private) are managed under `/v2/templates`; fetch any individual template \u2014 catalog or owned \u2014 via `/v2/templates/{id}`. At most 100 templates are returned.
|
|
3331
|
+
description: "List public templates. Returns the public template catalog. `source` selects which slice: `official` (the default) is Runpod-curated templates, `verified` is community templates Runpod has verified, and `community` is everything else other users have shared publicly. Both pod and serverless templates appear \u2014 use each entry's `serverless` flag to tell them apart. `registry` is always null for templates you don't own. Your own templates (public or private) are managed under `/v2/templates`; fetch any individual template \u2014 catalog or owned \u2014 via `/v2/templates/{id}`. At most 100 templates are returned. Cursor pagination is not yet supported here; `pagination` is always the exhausted marker (`nextCursor: null`, `hasNextPage: false`).",
|
|
2825
3332
|
method: "GET",
|
|
2826
3333
|
path: "/v2/catalog/templates",
|
|
2827
3334
|
params: [
|
|
@@ -2831,6 +3338,12 @@ var generatedTools = [
|
|
|
2831
3338
|
}
|
|
2832
3339
|
],
|
|
2833
3340
|
hasBody: false,
|
|
3341
|
+
annotations: {
|
|
3342
|
+
readOnlyHint: true,
|
|
3343
|
+
destructiveHint: false,
|
|
3344
|
+
idempotentHint: true,
|
|
3345
|
+
openWorldHint: true
|
|
3346
|
+
},
|
|
2834
3347
|
inputSchema: {
|
|
2835
3348
|
type: "object",
|
|
2836
3349
|
properties: {
|
|
@@ -2851,11 +3364,46 @@ var generatedTools = [
|
|
|
2851
3364
|
path: "/v2/registries",
|
|
2852
3365
|
params: [],
|
|
2853
3366
|
hasBody: false,
|
|
3367
|
+
annotations: {
|
|
3368
|
+
readOnlyHint: true,
|
|
3369
|
+
destructiveHint: false,
|
|
3370
|
+
idempotentHint: true,
|
|
3371
|
+
openWorldHint: true
|
|
3372
|
+
},
|
|
2854
3373
|
inputSchema: {
|
|
2855
3374
|
type: "object",
|
|
2856
3375
|
properties: {}
|
|
2857
3376
|
}
|
|
2858
3377
|
},
|
|
3378
|
+
{
|
|
3379
|
+
name: "list-secrets",
|
|
3380
|
+
operationId: "listSecrets",
|
|
3381
|
+
description: "List secrets. Returns the account's secrets \u2014 encrypted strings referenced from pod, serverless, and template environment variables with the `{{ RUNPOD_SECRET_<name> }}` placeholder syntax, substituted with the secret's value when the pod or worker boots. Secret values are write-only and are never returned.",
|
|
3382
|
+
method: "GET",
|
|
3383
|
+
path: "/v2/account/secrets",
|
|
3384
|
+
params: [
|
|
3385
|
+
{
|
|
3386
|
+
name: "name",
|
|
3387
|
+
location: "query"
|
|
3388
|
+
}
|
|
3389
|
+
],
|
|
3390
|
+
hasBody: false,
|
|
3391
|
+
annotations: {
|
|
3392
|
+
readOnlyHint: true,
|
|
3393
|
+
destructiveHint: false,
|
|
3394
|
+
idempotentHint: true,
|
|
3395
|
+
openWorldHint: true
|
|
3396
|
+
},
|
|
3397
|
+
inputSchema: {
|
|
3398
|
+
type: "object",
|
|
3399
|
+
properties: {
|
|
3400
|
+
name: {
|
|
3401
|
+
type: "string",
|
|
3402
|
+
description: "When provided, returns only the secret with this name (case-insensitive)."
|
|
3403
|
+
}
|
|
3404
|
+
}
|
|
3405
|
+
}
|
|
3406
|
+
},
|
|
2859
3407
|
{
|
|
2860
3408
|
name: "list-serverless-billing",
|
|
2861
3409
|
operationId: "listServerlessBilling",
|
|
@@ -2885,6 +3433,12 @@ var generatedTools = [
|
|
|
2885
3433
|
}
|
|
2886
3434
|
],
|
|
2887
3435
|
hasBody: false,
|
|
3436
|
+
annotations: {
|
|
3437
|
+
readOnlyHint: true,
|
|
3438
|
+
destructiveHint: false,
|
|
3439
|
+
idempotentHint: true,
|
|
3440
|
+
openWorldHint: true
|
|
3441
|
+
},
|
|
2888
3442
|
inputSchema: {
|
|
2889
3443
|
type: "object",
|
|
2890
3444
|
properties: {
|
|
@@ -2943,6 +3497,12 @@ var generatedTools = [
|
|
|
2943
3497
|
}
|
|
2944
3498
|
],
|
|
2945
3499
|
hasBody: true,
|
|
3500
|
+
annotations: {
|
|
3501
|
+
readOnlyHint: false,
|
|
3502
|
+
destructiveHint: true,
|
|
3503
|
+
idempotentHint: false,
|
|
3504
|
+
openWorldHint: true
|
|
3505
|
+
},
|
|
2946
3506
|
inputSchema: {
|
|
2947
3507
|
type: "object",
|
|
2948
3508
|
properties: {
|
|
@@ -2986,6 +3546,12 @@ var generatedTools = [
|
|
|
2986
3546
|
}
|
|
2987
3547
|
],
|
|
2988
3548
|
hasBody: false,
|
|
3549
|
+
annotations: {
|
|
3550
|
+
readOnlyHint: false,
|
|
3551
|
+
destructiveHint: true,
|
|
3552
|
+
idempotentHint: true,
|
|
3553
|
+
openWorldHint: true
|
|
3554
|
+
},
|
|
2989
3555
|
inputSchema: {
|
|
2990
3556
|
type: "object",
|
|
2991
3557
|
properties: {
|
|
@@ -3009,6 +3575,12 @@ var generatedTools = [
|
|
|
3009
3575
|
}
|
|
3010
3576
|
],
|
|
3011
3577
|
hasBody: true,
|
|
3578
|
+
annotations: {
|
|
3579
|
+
readOnlyHint: false,
|
|
3580
|
+
destructiveHint: false,
|
|
3581
|
+
idempotentHint: false,
|
|
3582
|
+
openWorldHint: true
|
|
3583
|
+
},
|
|
3012
3584
|
inputSchema: {
|
|
3013
3585
|
type: "object",
|
|
3014
3586
|
properties: {
|
|
@@ -3051,6 +3623,12 @@ var generatedTools = [
|
|
|
3051
3623
|
}
|
|
3052
3624
|
],
|
|
3053
3625
|
hasBody: true,
|
|
3626
|
+
annotations: {
|
|
3627
|
+
readOnlyHint: false,
|
|
3628
|
+
destructiveHint: false,
|
|
3629
|
+
idempotentHint: false,
|
|
3630
|
+
openWorldHint: true
|
|
3631
|
+
},
|
|
3054
3632
|
inputSchema: {
|
|
3055
3633
|
type: "object",
|
|
3056
3634
|
properties: {
|
|
@@ -3066,12 +3644,34 @@ var generatedTools = [
|
|
|
3066
3644
|
$defs: {
|
|
3067
3645
|
BaseContainerConfig: {
|
|
3068
3646
|
type: "object",
|
|
3069
|
-
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support
|
|
3647
|
+
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support a direct registry credential (clusters \u2014 there the registry credential arrives via a pod template, see CreateClusterRequest.templateId).\n",
|
|
3070
3648
|
properties: {
|
|
3071
3649
|
args: {
|
|
3072
3650
|
type: "string",
|
|
3073
|
-
description: "
|
|
3074
|
-
examples: [
|
|
3651
|
+
description: 'The container\'s command, as a single raw string. This is the field `entrypoint` and `cmd` encode into, exposed in its stored form.\n\nTwo shapes are accepted. A bare shell string is treated as CMD and split into arguments, which is what the console\'s "Container start command" field writes. A JSON object of the form `{"entrypoint":[...],"cmd":[...]}` sets either or both explicitly.\n\nResponses always return both representations: `args` exactly as stored, plus the deconstructed `entrypoint` and `cmd`. Supplying `args` together with `entrypoint` or `cmd` is allowed only when they describe the same command, so a read-modify-write client can send back everything it received. Send `""` to clear, omit to leave unchanged.\n',
|
|
3652
|
+
examples: [
|
|
3653
|
+
"--model meta-llama/Llama-3-8B --max-model-len 8192",
|
|
3654
|
+
'{"entrypoint":["/bin/bash","-c"],"cmd":["python -u main.py"]}',
|
|
3655
|
+
""
|
|
3656
|
+
]
|
|
3657
|
+
},
|
|
3658
|
+
cmd: {
|
|
3659
|
+
type: "array",
|
|
3660
|
+
items: {
|
|
3661
|
+
type: "string"
|
|
3662
|
+
},
|
|
3663
|
+
description: "Container CMD in exec form. When the image defines an ENTRYPOINT, this is the argument list passed to it. Encoded into the `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
3664
|
+
examples: [
|
|
3665
|
+
["--model", "meta-llama/Llama-3-8B", "--max-model-len", "8192"]
|
|
3666
|
+
]
|
|
3667
|
+
},
|
|
3668
|
+
entrypoint: {
|
|
3669
|
+
type: "array",
|
|
3670
|
+
items: {
|
|
3671
|
+
type: "string"
|
|
3672
|
+
},
|
|
3673
|
+
description: "Container ENTRYPOINT in exec form, overriding the image's own. Encoded into `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
3674
|
+
examples: [["/bin/bash", "-c"]]
|
|
3075
3675
|
},
|
|
3076
3676
|
disk: {
|
|
3077
3677
|
type: "integer",
|
|
@@ -3130,7 +3730,7 @@ var generatedTools = [
|
|
|
3130
3730
|
pools: {
|
|
3131
3731
|
type: "array",
|
|
3132
3732
|
minItems: 1,
|
|
3133
|
-
description:
|
|
3733
|
+
description: 'Serverless GPU pool IDs (as returned by `GET /v2/catalog/gpus` in\n`pool`). Workers are placed on whichever listed pool has capacity.\nNarrow a pool down to specific cards with `excludedTypes`.\n\nOn `PATCH`, `pools` and `excludedTypes` are one selection and are\nreplaced together, so sending `pools` by itself **clears the\nexclusions**. Two cases:\n\n- **Changing pools, keeping exclusions** \u2014 send both fields in one\n request: `{"gpu": {"pools": ["ADA_24"], "excludedTypes":\n ["NVIDIA L40"]}}`. `GET` the endpoint first to read the current\n `excludedTypes` and resend the ones that still apply to the new\n pools; an exclusion naming a type outside `pools` is a 400.\n- **Changing only `count` or a CUDA constraint** \u2014 omit `pools`:\n `{"gpu": {"minCudaVersion": "12.4"}}`. The pool list and the\n exclusions are both left exactly as they are.\n\n`excludedTypes` documents the full rule.\n',
|
|
3134
3734
|
items: {
|
|
3135
3735
|
type: "string"
|
|
3136
3736
|
},
|
|
@@ -3375,6 +3975,12 @@ var generatedTools = [
|
|
|
3375
3975
|
}
|
|
3376
3976
|
],
|
|
3377
3977
|
hasBody: true,
|
|
3978
|
+
annotations: {
|
|
3979
|
+
readOnlyHint: false,
|
|
3980
|
+
destructiveHint: false,
|
|
3981
|
+
idempotentHint: false,
|
|
3982
|
+
openWorldHint: true
|
|
3983
|
+
},
|
|
3378
3984
|
inputSchema: {
|
|
3379
3985
|
type: "object",
|
|
3380
3986
|
properties: {
|
|
@@ -3425,6 +4031,12 @@ var generatedTools = [
|
|
|
3425
4031
|
}
|
|
3426
4032
|
],
|
|
3427
4033
|
hasBody: true,
|
|
4034
|
+
annotations: {
|
|
4035
|
+
readOnlyHint: false,
|
|
4036
|
+
destructiveHint: false,
|
|
4037
|
+
idempotentHint: false,
|
|
4038
|
+
openWorldHint: true
|
|
4039
|
+
},
|
|
3428
4040
|
inputSchema: {
|
|
3429
4041
|
type: "object",
|
|
3430
4042
|
properties: {
|
|
@@ -3440,12 +4052,34 @@ var generatedTools = [
|
|
|
3440
4052
|
$defs: {
|
|
3441
4053
|
BaseContainerConfig: {
|
|
3442
4054
|
type: "object",
|
|
3443
|
-
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support
|
|
4055
|
+
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support a direct registry credential (clusters \u2014 there the registry credential arrives via a pod template, see CreateClusterRequest.templateId).\n",
|
|
3444
4056
|
properties: {
|
|
3445
4057
|
args: {
|
|
3446
4058
|
type: "string",
|
|
3447
|
-
description: "
|
|
3448
|
-
examples: [
|
|
4059
|
+
description: 'The container\'s command, as a single raw string. This is the field `entrypoint` and `cmd` encode into, exposed in its stored form.\n\nTwo shapes are accepted. A bare shell string is treated as CMD and split into arguments, which is what the console\'s "Container start command" field writes. A JSON object of the form `{"entrypoint":[...],"cmd":[...]}` sets either or both explicitly.\n\nResponses always return both representations: `args` exactly as stored, plus the deconstructed `entrypoint` and `cmd`. Supplying `args` together with `entrypoint` or `cmd` is allowed only when they describe the same command, so a read-modify-write client can send back everything it received. Send `""` to clear, omit to leave unchanged.\n',
|
|
4060
|
+
examples: [
|
|
4061
|
+
"--model meta-llama/Llama-3-8B --max-model-len 8192",
|
|
4062
|
+
'{"entrypoint":["/bin/bash","-c"],"cmd":["python -u main.py"]}',
|
|
4063
|
+
""
|
|
4064
|
+
]
|
|
4065
|
+
},
|
|
4066
|
+
cmd: {
|
|
4067
|
+
type: "array",
|
|
4068
|
+
items: {
|
|
4069
|
+
type: "string"
|
|
4070
|
+
},
|
|
4071
|
+
description: "Container CMD in exec form. When the image defines an ENTRYPOINT, this is the argument list passed to it. Encoded into the `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
4072
|
+
examples: [
|
|
4073
|
+
["--model", "meta-llama/Llama-3-8B", "--max-model-len", "8192"]
|
|
4074
|
+
]
|
|
4075
|
+
},
|
|
4076
|
+
entrypoint: {
|
|
4077
|
+
type: "array",
|
|
4078
|
+
items: {
|
|
4079
|
+
type: "string"
|
|
4080
|
+
},
|
|
4081
|
+
description: "Container ENTRYPOINT in exec form, overriding the image's own. Encoded into `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
4082
|
+
examples: [["/bin/bash", "-c"]]
|
|
3449
4083
|
},
|
|
3450
4084
|
disk: {
|
|
3451
4085
|
type: "integer",
|
|
@@ -3588,6 +4222,60 @@ var generatedTools = [
|
|
|
3588
4222
|
}
|
|
3589
4223
|
}
|
|
3590
4224
|
},
|
|
4225
|
+
{
|
|
4226
|
+
name: "update-secret",
|
|
4227
|
+
operationId: "updateSecret",
|
|
4228
|
+
description: "Update a secret. Rotates a secret's value and/or updates its description. Only the provided fields are changed and at least one field is required; the `name` is immutable. Pods and workers receive the new value at their next boot \u2014 running instances keep the value they were started with. When both fields are sent, the value is applied first, then the description. The two updates are not atomic: if the description update fails after the value was rotated, the response is an error but the new value has already taken effect. Send the fields in separate requests when that partial outcome matters.",
|
|
4229
|
+
method: "PATCH",
|
|
4230
|
+
path: "/v2/account/secrets/{id}",
|
|
4231
|
+
params: [
|
|
4232
|
+
{
|
|
4233
|
+
name: "id",
|
|
4234
|
+
location: "path"
|
|
4235
|
+
}
|
|
4236
|
+
],
|
|
4237
|
+
hasBody: true,
|
|
4238
|
+
annotations: {
|
|
4239
|
+
readOnlyHint: false,
|
|
4240
|
+
destructiveHint: false,
|
|
4241
|
+
idempotentHint: false,
|
|
4242
|
+
openWorldHint: true
|
|
4243
|
+
},
|
|
4244
|
+
inputSchema: {
|
|
4245
|
+
type: "object",
|
|
4246
|
+
properties: {
|
|
4247
|
+
id: {
|
|
4248
|
+
type: "string",
|
|
4249
|
+
description: "Secret identifier"
|
|
4250
|
+
},
|
|
4251
|
+
body: {
|
|
4252
|
+
$ref: "#/$defs/UpdateSecretRequest"
|
|
4253
|
+
}
|
|
4254
|
+
},
|
|
4255
|
+
required: ["id", "body"],
|
|
4256
|
+
$defs: {
|
|
4257
|
+
UpdateSecretRequest: {
|
|
4258
|
+
type: "object",
|
|
4259
|
+
additionalProperties: false,
|
|
4260
|
+
minProperties: 1,
|
|
4261
|
+
description: "Only the provided fields are updated; at least one field is required.\nThe secret's `name` is immutable.\n",
|
|
4262
|
+
properties: {
|
|
4263
|
+
value: {
|
|
4264
|
+
type: "string",
|
|
4265
|
+
minLength: 1,
|
|
4266
|
+
maxLength: 16777216,
|
|
4267
|
+
description: "New secret value, replacing the current one. Write-only. Must be smaller than 16 MiB of UTF-8 text (strictly under 16,777,216 bytes)."
|
|
4268
|
+
},
|
|
4269
|
+
description: {
|
|
4270
|
+
type: "string",
|
|
4271
|
+
maxLength: 65535,
|
|
4272
|
+
description: 'New human-readable description, at most 65,535 bytes of UTF-8 text. Send `""` to clear.'
|
|
4273
|
+
}
|
|
4274
|
+
}
|
|
4275
|
+
}
|
|
4276
|
+
}
|
|
4277
|
+
}
|
|
4278
|
+
},
|
|
3591
4279
|
{
|
|
3592
4280
|
name: "update-ssh-keys",
|
|
3593
4281
|
operationId: "updateSshKeys",
|
|
@@ -3596,6 +4284,12 @@ var generatedTools = [
|
|
|
3596
4284
|
path: "/v2/account/ssh-keys",
|
|
3597
4285
|
params: [],
|
|
3598
4286
|
hasBody: true,
|
|
4287
|
+
annotations: {
|
|
4288
|
+
readOnlyHint: false,
|
|
4289
|
+
destructiveHint: true,
|
|
4290
|
+
idempotentHint: true,
|
|
4291
|
+
openWorldHint: true
|
|
4292
|
+
},
|
|
3599
4293
|
inputSchema: {
|
|
3600
4294
|
type: "object",
|
|
3601
4295
|
properties: {
|
|
@@ -3641,6 +4335,12 @@ var generatedTools = [
|
|
|
3641
4335
|
}
|
|
3642
4336
|
],
|
|
3643
4337
|
hasBody: true,
|
|
4338
|
+
annotations: {
|
|
4339
|
+
readOnlyHint: false,
|
|
4340
|
+
destructiveHint: false,
|
|
4341
|
+
idempotentHint: false,
|
|
4342
|
+
openWorldHint: true
|
|
4343
|
+
},
|
|
3644
4344
|
inputSchema: {
|
|
3645
4345
|
type: "object",
|
|
3646
4346
|
properties: {
|
|
@@ -3655,12 +4355,34 @@ var generatedTools = [
|
|
|
3655
4355
|
$defs: {
|
|
3656
4356
|
BaseContainerConfig: {
|
|
3657
4357
|
type: "object",
|
|
3658
|
-
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support
|
|
4358
|
+
description: "Container configuration universal to every containerized resource. Compose ContainerConfig instead unless the resource cannot support a direct registry credential (clusters \u2014 there the registry credential arrives via a pod template, see CreateClusterRequest.templateId).\n",
|
|
3659
4359
|
properties: {
|
|
3660
4360
|
args: {
|
|
3661
4361
|
type: "string",
|
|
3662
|
-
description: "
|
|
3663
|
-
examples: [
|
|
4362
|
+
description: 'The container\'s command, as a single raw string. This is the field `entrypoint` and `cmd` encode into, exposed in its stored form.\n\nTwo shapes are accepted. A bare shell string is treated as CMD and split into arguments, which is what the console\'s "Container start command" field writes. A JSON object of the form `{"entrypoint":[...],"cmd":[...]}` sets either or both explicitly.\n\nResponses always return both representations: `args` exactly as stored, plus the deconstructed `entrypoint` and `cmd`. Supplying `args` together with `entrypoint` or `cmd` is allowed only when they describe the same command, so a read-modify-write client can send back everything it received. Send `""` to clear, omit to leave unchanged.\n',
|
|
4363
|
+
examples: [
|
|
4364
|
+
"--model meta-llama/Llama-3-8B --max-model-len 8192",
|
|
4365
|
+
'{"entrypoint":["/bin/bash","-c"],"cmd":["python -u main.py"]}',
|
|
4366
|
+
""
|
|
4367
|
+
]
|
|
4368
|
+
},
|
|
4369
|
+
cmd: {
|
|
4370
|
+
type: "array",
|
|
4371
|
+
items: {
|
|
4372
|
+
type: "string"
|
|
4373
|
+
},
|
|
4374
|
+
description: "Container CMD in exec form. When the image defines an ENTRYPOINT, this is the argument list passed to it. Encoded into the `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
4375
|
+
examples: [
|
|
4376
|
+
["--model", "meta-llama/Llama-3-8B", "--max-model-len", "8192"]
|
|
4377
|
+
]
|
|
4378
|
+
},
|
|
4379
|
+
entrypoint: {
|
|
4380
|
+
type: "array",
|
|
4381
|
+
items: {
|
|
4382
|
+
type: "string"
|
|
4383
|
+
},
|
|
4384
|
+
description: "Container ENTRYPOINT in exec form, overriding the image's own. Encoded into `args` field; supplying both is allowed only when they describe the same command. Send `[]` to clear, omit to leave unchanged.\n",
|
|
4385
|
+
examples: [["/bin/bash", "-c"]]
|
|
3664
4386
|
},
|
|
3665
4387
|
disk: {
|
|
3666
4388
|
type: "integer",
|
|
@@ -3977,6 +4699,26 @@ var listPaginationProperties = {
|
|
|
3977
4699
|
description: "Opaque pagination cursor from a previous response (nextCursor). Omit to start from the beginning."
|
|
3978
4700
|
}
|
|
3979
4701
|
};
|
|
4702
|
+
function clampListLimit(limit) {
|
|
4703
|
+
const requested = Number(limit);
|
|
4704
|
+
return Math.min(
|
|
4705
|
+
Number.isFinite(requested) && requested >= 1 ? Math.floor(requested) : DEFAULT_LIST_LIMIT,
|
|
4706
|
+
MAX_LIST_LIMIT
|
|
4707
|
+
);
|
|
4708
|
+
}
|
|
4709
|
+
function serverPageQuery(args) {
|
|
4710
|
+
const cursor = typeof args.cursor === "string" && args.cursor !== "" ? args.cursor : void 0;
|
|
4711
|
+
return { limit: clampListLimit(args.limit), ...cursor ? { cursor } : {} };
|
|
4712
|
+
}
|
|
4713
|
+
function serverPagination(pagination, returned) {
|
|
4714
|
+
const hasNextPage = pagination?.hasNextPage === true;
|
|
4715
|
+
return {
|
|
4716
|
+
returned,
|
|
4717
|
+
hasNextPage,
|
|
4718
|
+
nextCursor: pagination?.nextCursor ?? null,
|
|
4719
|
+
...hasNextPage ? { note: "More results exist. Pass cursor=nextCursor to fetch them." } : {}
|
|
4720
|
+
};
|
|
4721
|
+
}
|
|
3980
4722
|
function decodeCursorOffset(cursor) {
|
|
3981
4723
|
if (!cursor) return 0;
|
|
3982
4724
|
try {
|
|
@@ -3992,11 +4734,7 @@ function encodeCursorOffset(offset) {
|
|
|
3992
4734
|
return Buffer.from(String(offset), "utf8").toString("base64");
|
|
3993
4735
|
}
|
|
3994
4736
|
function capList(items, options, extra) {
|
|
3995
|
-
const
|
|
3996
|
-
const limit = Math.min(
|
|
3997
|
-
Number.isFinite(requested) && requested >= 1 ? Math.floor(requested) : DEFAULT_LIST_LIMIT,
|
|
3998
|
-
MAX_LIST_LIMIT
|
|
3999
|
-
);
|
|
4737
|
+
const limit = clampListLimit(options.limit);
|
|
4000
4738
|
const offset = decodeCursorOffset(options.cursor);
|
|
4001
4739
|
const total = items.length;
|
|
4002
4740
|
const page = items.slice(offset, offset + limit);
|
|
@@ -4075,6 +4813,38 @@ async function runTool(body) {
|
|
|
4075
4813
|
}
|
|
4076
4814
|
}
|
|
4077
4815
|
|
|
4816
|
+
// src/specgen/tools/annotations.ts
|
|
4817
|
+
var readOnly = {
|
|
4818
|
+
readOnlyHint: true,
|
|
4819
|
+
destructiveHint: false,
|
|
4820
|
+
idempotentHint: true,
|
|
4821
|
+
openWorldHint: true
|
|
4822
|
+
};
|
|
4823
|
+
var bundledRead = {
|
|
4824
|
+
readOnlyHint: true,
|
|
4825
|
+
destructiveHint: false,
|
|
4826
|
+
idempotentHint: true,
|
|
4827
|
+
openWorldHint: false
|
|
4828
|
+
};
|
|
4829
|
+
var write = {
|
|
4830
|
+
readOnlyHint: false,
|
|
4831
|
+
destructiveHint: false,
|
|
4832
|
+
idempotentHint: false,
|
|
4833
|
+
openWorldHint: true
|
|
4834
|
+
};
|
|
4835
|
+
var idempotentWrite = {
|
|
4836
|
+
readOnlyHint: false,
|
|
4837
|
+
destructiveHint: false,
|
|
4838
|
+
idempotentHint: true,
|
|
4839
|
+
openWorldHint: true
|
|
4840
|
+
};
|
|
4841
|
+
var destructive = {
|
|
4842
|
+
readOnlyHint: false,
|
|
4843
|
+
destructiveHint: true,
|
|
4844
|
+
idempotentHint: true,
|
|
4845
|
+
openWorldHint: true
|
|
4846
|
+
};
|
|
4847
|
+
|
|
4078
4848
|
// src/specgen/tools/capacity.ts
|
|
4079
4849
|
var CUDA_VERSION_REGEX = /^\d{1,2}\.\d{1,2}$/;
|
|
4080
4850
|
var MAX_PROBE_VERSIONS = 12;
|
|
@@ -4109,6 +4879,7 @@ function rankByStock(rows, stats, includeUnavailable) {
|
|
|
4109
4879
|
}
|
|
4110
4880
|
var getCapacity = {
|
|
4111
4881
|
name: "get-capacity",
|
|
4882
|
+
annotations: readOnly,
|
|
4112
4883
|
description: "GPU capacity across host CUDA versions, as a matrix. Use this to choose an endpoint's allowedCudaVersions/minCudaVersion (or diagnose/widen a capacity-starved one) and to distinguish capacity problems from compatibility problems. Default mode is one call returning, per GPU type, overall stock plus AVAILABLE/UNAVAILABLE per host-reported CUDA version. Pass cudaVersions to deep-probe instead: one stock lookup per listed version, returning graded stock (High/Medium/Low/Out) and the lowest on-demand price per version; a probe that fails transiently reports a per-version error instead of failing the call. Nothing is hidden by default \u2014 set includeUnavailable:false to drop GPUs with no stock on any listed version. Credential-free public catalog data. Stock is live, so page cursors can shift between calls.",
|
|
4113
4884
|
inputSchema: {
|
|
4114
4885
|
type: "object",
|
|
@@ -4309,6 +5080,7 @@ function formatGpuIds(gpu) {
|
|
|
4309
5080
|
}
|
|
4310
5081
|
var setEndpointGpus = {
|
|
4311
5082
|
name: "set-endpoint-gpus",
|
|
5083
|
+
annotations: idempotentWrite,
|
|
4312
5084
|
description: "Set which GPUs a Serverless endpoint's workers run on \u2014 including pinning specific GPU SKUs. Provide either a raw gpuIds string, or pools plus optional excludeGpuTypeIds (GPU type ids from list-gpu-types) and the exclusion string is built for you: a pool allows every SKU in it, and excluding all but one SKU pins that SKU exactly. Updates only GPU settings through REST v2, preserving other endpoint settings. create-endpoint/update-endpoint also support gpu.excludedTypes.",
|
|
4313
5085
|
inputSchema: {
|
|
4314
5086
|
type: "object",
|
|
@@ -4502,6 +5274,7 @@ function randomSuffix() {
|
|
|
4502
5274
|
}
|
|
4503
5275
|
var listHubRepos = {
|
|
4504
5276
|
name: "list-hub-repos",
|
|
5277
|
+
annotations: readOnly,
|
|
4505
5278
|
description: "List repos published to the Runpod Hub (prebuilt Serverless workers and Pod templates, e.g. vLLM, ComfyUI). Public catalog \u2014 no auth required. Each result includes the currently listed release with its hubReleaseId and prebuilt image name. Results are sorted by deploy count (most popular first). Set includeConfig:true to also return the release config (hardware requirements and environment-variable schema) \u2014 it is large, so prefer requesting it for a single repo via the repoOwner/searchTerm filters.",
|
|
4506
5279
|
inputSchema: {
|
|
4507
5280
|
type: "object",
|
|
@@ -4603,6 +5376,7 @@ var listHubRepos = {
|
|
|
4603
5376
|
};
|
|
4604
5377
|
var deployHubRepo = {
|
|
4605
5378
|
name: "deploy-hub-repo",
|
|
5379
|
+
annotations: write,
|
|
4606
5380
|
description: "Deploy a Runpod Hub repo's listed release as a new Serverless endpoint (the same as clicking Deploy on the Hub). Identify the repo by `repo` (\"owner/name\" from list-hub-repos) or by `hubReleaseId`. The release supplies the prebuilt image, container disk, CUDA constraints, and env-var defaults; pass `env` to override or fill in values (required keys without a default must be provided \u2014 check list-hub-repos with includeConfig:true for the schema). GPU selection comes from the release config when it specifies one; otherwise pass gpuIds (GPU pool names, e.g. 'ADA_24' or 'ADA_80_PRO,AMPERE_80'). Uses the authenticated GraphQL API (no REST home for Hub deploys yet).",
|
|
4607
5381
|
inputSchema: {
|
|
4608
5382
|
type: "object",
|
|
@@ -5060,6 +5834,7 @@ function validateWait(wait) {
|
|
|
5060
5834
|
}
|
|
5061
5835
|
var runEndpoint = {
|
|
5062
5836
|
name: "run-endpoint",
|
|
5837
|
+
annotations: write,
|
|
5063
5838
|
description: "Submit an asynchronous job to a Serverless endpoint. Returns a job ID immediately \u2014 use get-job-status to poll for results (pass its `wait` to block through a cold start instead of tight-looping). Async results are available for 30 minutes after completion.",
|
|
5064
5839
|
inputSchema: {
|
|
5065
5840
|
type: "object",
|
|
@@ -5089,6 +5864,7 @@ var runEndpoint = {
|
|
|
5089
5864
|
};
|
|
5090
5865
|
var runsyncEndpoint = {
|
|
5091
5866
|
name: "runsync-endpoint",
|
|
5867
|
+
annotations: write,
|
|
5092
5868
|
description: "Submit a synchronous job to a Serverless endpoint and wait for the result. Best for fast tasks: if the job outlives the wait, the response returns a job ID and a non-terminal status (IN_QUEUE or IN_PROGRESS) to poll with get-job-status. Max payload 20 MB; results expire after 1 minute. The wait parameter extends the server-side wait" + (HOSTED ? ` \u2014 this server runs behind a 60-second gateway deadline, so waits clamp to ${HTTP_LONG_POLL_BUDGET_MS} ms, which is also the effective default. For longer jobs use run-endpoint + get-job-status.` : " to up to 5 minutes (300000 ms); it defaults to 90000 (90 seconds)."),
|
|
5093
5869
|
inputSchema: {
|
|
5094
5870
|
type: "object",
|
|
@@ -5132,6 +5908,7 @@ var runsyncEndpoint = {
|
|
|
5132
5908
|
};
|
|
5133
5909
|
var getJobStatus = {
|
|
5134
5910
|
name: "get-job-status",
|
|
5911
|
+
annotations: readOnly,
|
|
5135
5912
|
description: "Check the status of a Serverless job. Returns the current status and output when complete. Job statuses: IN_QUEUE, IN_PROGRESS, COMPLETED, FAILED, CANCELLED, TIMED_OUT. Pass `wait` (milliseconds, up to " + STATUS_WAIT_MAX_MS + ") to BLOCK server-side, polling until the job reaches a terminal status or the budget expires \u2014 use it to ride out a cold start (a first job on a fresh worker pulls the image and loads the model, commonly 1\u20135+ minutes) in a single call instead of returning on the first IN_QUEUE and tight-looping the tool. Without `wait` it returns the current status immediately (a single check). If the budget expires before a terminal status, it returns the latest non-terminal status with pollingTimedOut:true \u2014 call again (with `wait`) to keep blocking. IMPORTANT: a job stuck IN_QUEUE does not necessarily mean a capacity shortage \u2014 a worker may have spun up and crash-looped. When the job is IN_QUEUE this tool attaches a workerHealth summary and a hint. To dig deeper call list-endpoint-workers, then read stream-worker-logs regardless of the status a worker reports: a container failing to start loops while its worker still shows RUNNING or THROTTLED and unhealthy stays 0, so UNHEALTHY is one symptom of a crash loop and not a test for it. The logs are the authority.",
|
|
5136
5913
|
inputSchema: {
|
|
5137
5914
|
type: "object",
|
|
@@ -5179,6 +5956,7 @@ var getJobStatus = {
|
|
|
5179
5956
|
};
|
|
5180
5957
|
var streamJob = {
|
|
5181
5958
|
name: "stream-job",
|
|
5959
|
+
annotations: readOnly,
|
|
5182
5960
|
description: `Retrieve streaming output from a Serverless job. The worker must support streaming output. Polls /stream/{jobId} and collects chunks until the status is COMPLETED, FAILED, CANCELLED, or TIMED_OUT, for up to ${formatBudget(STREAM_BUDGET_MS)}. If the budget expires first, returns the chunks collected so far with pollingTimedOut: true \u2014 call stream-job again to resume where it left off, or get-job-status to check without streaming.`,
|
|
5183
5961
|
inputSchema: {
|
|
5184
5962
|
type: "object",
|
|
@@ -5209,6 +5987,7 @@ var streamJob = {
|
|
|
5209
5987
|
};
|
|
5210
5988
|
var cancelJob = {
|
|
5211
5989
|
name: "cancel-job",
|
|
5990
|
+
annotations: destructive,
|
|
5212
5991
|
description: "Cancel a Serverless job that is queued or in progress.",
|
|
5213
5992
|
inputSchema: {
|
|
5214
5993
|
type: "object",
|
|
@@ -5233,6 +6012,7 @@ var cancelJob = {
|
|
|
5233
6012
|
};
|
|
5234
6013
|
var retryJob = {
|
|
5235
6014
|
name: "retry-job",
|
|
6015
|
+
annotations: write,
|
|
5236
6016
|
description: "Retry a failed or timed-out Serverless job. Only works for jobs with FAILED or TIMED_OUT status. The previous output is removed and the job is requeued.",
|
|
5237
6017
|
inputSchema: {
|
|
5238
6018
|
type: "object",
|
|
@@ -5257,6 +6037,7 @@ var retryJob = {
|
|
|
5257
6037
|
};
|
|
5258
6038
|
var endpointHealth = {
|
|
5259
6039
|
name: "endpoint-health",
|
|
6040
|
+
annotations: readOnly,
|
|
5260
6041
|
description: "Get the endpoint-level health rollup for a Serverless endpoint: worker counts by state plus job queue statistics. This is the runtime plane's own /health view and it can lag or disagree with the per-worker truth \u2014 when a job is stuck IN_QUEUE, prefer list-endpoint-workers over this rollup for per-worker state \u2014 but treat neither as the authority on crash loops, because a container failing to start loops while its worker reports RUNNING or THROTTLED and unhealthy stays 0; stream-worker-logs is what settles it, and note that get-job-status already attaches that worker summary and a hint on every IN_QUEUE result. Zero workers here means the endpoint is waiting for GPU capacity.",
|
|
5261
6042
|
inputSchema: {
|
|
5262
6043
|
type: "object",
|
|
@@ -5276,6 +6057,7 @@ var endpointHealth = {
|
|
|
5276
6057
|
};
|
|
5277
6058
|
var purgeEndpointQueue = {
|
|
5278
6059
|
name: "purge-endpoint-queue",
|
|
6060
|
+
annotations: destructive,
|
|
5279
6061
|
description: "Remove all pending jobs from a Serverless endpoint queue. Only affects queued jobs \u2014 in-progress jobs continue running. Use this for error recovery or clearing outdated requests.",
|
|
5280
6062
|
inputSchema: {
|
|
5281
6063
|
type: "object",
|
|
@@ -5311,13 +6093,16 @@ var jobTools = [
|
|
|
5311
6093
|
// src/specgen/tools/list-endpoints.ts
|
|
5312
6094
|
var listEndpoints = {
|
|
5313
6095
|
name: "list-endpoints",
|
|
6096
|
+
annotations: readOnly,
|
|
5314
6097
|
description: "List serverless endpoints owned by the account (trimmed: id, name, image, compute config, worker counts, scaling, data centers per endpoint \u2014 env vars and request URLs are omitted; use get-endpoint for the full object). Returns a page; pass cursor=nextCursor for more.",
|
|
5315
6098
|
inputSchema: {
|
|
5316
6099
|
type: "object",
|
|
5317
6100
|
properties: { ...listPaginationProperties }
|
|
5318
6101
|
},
|
|
5319
6102
|
async handler(ctx, args) {
|
|
5320
|
-
const { data, error, response } = await ctx.sdk.GET("/v2/serverless"
|
|
6103
|
+
const { data, error, response } = await ctx.sdk.GET("/v2/serverless", {
|
|
6104
|
+
params: { query: serverPageQuery(args) }
|
|
6105
|
+
});
|
|
5321
6106
|
if (!response.ok) return restError(response, error);
|
|
5322
6107
|
if (!data || !Array.isArray(data.endpoints)) {
|
|
5323
6108
|
return {
|
|
@@ -5342,10 +6127,10 @@ var listEndpoints = {
|
|
|
5342
6127
|
return {
|
|
5343
6128
|
ok: true,
|
|
5344
6129
|
status: response.status,
|
|
5345
|
-
payload:
|
|
5346
|
-
|
|
5347
|
-
|
|
5348
|
-
}
|
|
6130
|
+
payload: {
|
|
6131
|
+
items: trimmed,
|
|
6132
|
+
pagination: serverPagination(data.pagination, trimmed.length)
|
|
6133
|
+
}
|
|
5349
6134
|
};
|
|
5350
6135
|
}
|
|
5351
6136
|
};
|
|
@@ -5353,10 +6138,16 @@ var listEndpoints = {
|
|
|
5353
6138
|
// src/specgen/tools/list-templates.ts
|
|
5354
6139
|
var listTemplates = {
|
|
5355
6140
|
name: "list-templates",
|
|
5356
|
-
|
|
5357
|
-
|
|
5358
|
-
|
|
5359
|
-
|
|
6141
|
+
annotations: readOnly,
|
|
6142
|
+
description: "List templates visible to the account. Returns id, name, image, and serverless flag per template; use get-template for full detail. Returns 20 templates per page by default. To find a template, follow `pagination.nextCursor` until `hasNextPage` is false: a name missing from one page may be on a later one.",
|
|
6143
|
+
inputSchema: {
|
|
6144
|
+
type: "object",
|
|
6145
|
+
properties: { ...listPaginationProperties }
|
|
6146
|
+
},
|
|
6147
|
+
async handler(ctx, args) {
|
|
6148
|
+
const { data, error, response } = await ctx.sdk.GET("/v2/templates", {
|
|
6149
|
+
params: { query: serverPageQuery(args) }
|
|
6150
|
+
});
|
|
5360
6151
|
if (!response.ok) return restError(response, error);
|
|
5361
6152
|
if (!data || !Array.isArray(data.templates)) {
|
|
5362
6153
|
return {
|
|
@@ -5374,13 +6165,14 @@ var listTemplates = {
|
|
|
5374
6165
|
name: template.name,
|
|
5375
6166
|
image: template.image,
|
|
5376
6167
|
serverless: template.serverless
|
|
5377
|
-
}))
|
|
6168
|
+
})),
|
|
6169
|
+
pagination: serverPagination(data.pagination, data.templates.length)
|
|
5378
6170
|
}
|
|
5379
6171
|
};
|
|
5380
6172
|
}
|
|
5381
6173
|
};
|
|
5382
6174
|
|
|
5383
|
-
// node_modules/.pnpm/@runpod+typescript-api-sdk@0.
|
|
6175
|
+
// node_modules/.pnpm/@runpod+typescript-api-sdk@0.2.0/node_modules/@runpod/typescript-api-sdk/dist/index.js
|
|
5384
6176
|
var PATH_PARAM_RE = /\{[^{}]+\}/g;
|
|
5385
6177
|
var supportsRequestInitExt = () => {
|
|
5386
6178
|
return typeof process === "object" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici;
|
|
@@ -6784,6 +7576,7 @@ function logParams(args) {
|
|
|
6784
7576
|
}
|
|
6785
7577
|
var streamPodLogs = {
|
|
6786
7578
|
name: "stream-pod-logs",
|
|
7579
|
+
annotations: readOnly,
|
|
6787
7580
|
description: "Read a bounded snapshot of a Pod's logs (container and/or system source). Holds the live stream open for maxWaitMs and returns the parsed log lines; `truncated: true` means the byte cap cut the output. Use `since` to resume from a timestamp.",
|
|
6788
7581
|
inputSchema: {
|
|
6789
7582
|
type: "object",
|
|
@@ -6805,6 +7598,7 @@ var streamPodLogs = {
|
|
|
6805
7598
|
};
|
|
6806
7599
|
var streamWorkerLogs = {
|
|
6807
7600
|
name: "stream-worker-logs",
|
|
7601
|
+
annotations: readOnly,
|
|
6808
7602
|
description: "Read a bounded snapshot of a Serverless worker's logs (container and/or system source). Holds the live stream open for maxWaitMs and returns the parsed log lines; `truncated: true` means the byte cap cut the output. Get worker IDs from list-endpoint-workers. Use this whenever a job stays IN_QUEUE while workers exist, whatever status they report \u2014 a crash-looping container often still shows RUNNING or THROTTLED with unhealthy 0, so these logs, not the worker status, are what identify a crash loop.",
|
|
6809
7603
|
inputSchema: {
|
|
6810
7604
|
type: "object",
|
|
@@ -6845,6 +7639,7 @@ function parseMetadata(metadata) {
|
|
|
6845
7639
|
}
|
|
6846
7640
|
var listPublicEndpoints = {
|
|
6847
7641
|
name: "list-public-endpoints",
|
|
7642
|
+
annotations: readOnly,
|
|
6848
7643
|
description: "List Runpod Public Endpoints \u2014 managed, pay-per-use model APIs (text, image, video, audio) that require no deployment. Public catalog, no auth required. Each result includes the endpointId to call with run-endpoint/runsync-endpoint (or via https://api.runpod.ai/v2/{endpointId}), the model name, modality, owner, and pricing. Only live endpoints are returned by default; set includeOffline:true to also list ones that are not currently live.",
|
|
6849
7644
|
inputSchema: {
|
|
6850
7645
|
type: "object",
|
|
@@ -6943,6 +7738,318 @@ var listPublicEndpoints = {
|
|
|
6943
7738
|
})
|
|
6944
7739
|
};
|
|
6945
7740
|
|
|
7741
|
+
// src/specgen/tools/knowledge.ts
|
|
7742
|
+
import {
|
|
7743
|
+
loadKnowledge
|
|
7744
|
+
} from "@runpod/plugin-knowledge";
|
|
7745
|
+
var knowledge = loadKnowledge();
|
|
7746
|
+
var GUIDE_KINDS = ["skill", "reference", "golden-path"];
|
|
7747
|
+
var STOPWORDS = new Set(
|
|
7748
|
+
"a an and are as at be by can do does for from how i in is it my of on or the to what when why with you your".split(
|
|
7749
|
+
" "
|
|
7750
|
+
)
|
|
7751
|
+
);
|
|
7752
|
+
var singular = (word) => {
|
|
7753
|
+
if (word.length > 4 && word.endsWith("ies")) return `${word.slice(0, -3)}y`;
|
|
7754
|
+
if (word.length > 3 && word.endsWith("s") && !word.endsWith("ss"))
|
|
7755
|
+
return word.slice(0, -1);
|
|
7756
|
+
return word;
|
|
7757
|
+
};
|
|
7758
|
+
var words = (text) => text.toLowerCase().split(/[^a-z0-9]+/).filter((word) => word.length > 1 && !STOPWORDS.has(word)).map(singular);
|
|
7759
|
+
function editDistance(a, b, max) {
|
|
7760
|
+
if (Math.abs(a.length - b.length) > max) return max + 1;
|
|
7761
|
+
let previous = Array.from({ length: b.length + 1 }, (_, i) => i);
|
|
7762
|
+
for (let i = 1; i <= a.length; i++) {
|
|
7763
|
+
const current = [i];
|
|
7764
|
+
for (let j = 1; j <= b.length; j++) {
|
|
7765
|
+
current[j] = Math.min(
|
|
7766
|
+
previous[j] + 1,
|
|
7767
|
+
current[j - 1] + 1,
|
|
7768
|
+
previous[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1)
|
|
7769
|
+
);
|
|
7770
|
+
}
|
|
7771
|
+
if (Math.min(...current) > max) return max + 1;
|
|
7772
|
+
previous = current;
|
|
7773
|
+
}
|
|
7774
|
+
return previous[b.length];
|
|
7775
|
+
}
|
|
7776
|
+
var typoBudget = (text) => text.length >= 8 ? 2 : text.length >= 4 ? 1 : 0;
|
|
7777
|
+
var oneTypo = (word, term) => term.length >= 5 && editDistance(word, term, 1) <= 1;
|
|
7778
|
+
var termMatches = (word, term) => word.startsWith(term) || oneTypo(word, term);
|
|
7779
|
+
var nameMatches = (name, term) => name === term || oneTypo(name, term);
|
|
7780
|
+
var guideSummary = ({
|
|
7781
|
+
id,
|
|
7782
|
+
kind,
|
|
7783
|
+
title,
|
|
7784
|
+
description,
|
|
7785
|
+
lanes,
|
|
7786
|
+
mcp,
|
|
7787
|
+
needs_shell,
|
|
7788
|
+
concepts
|
|
7789
|
+
}) => ({
|
|
7790
|
+
id,
|
|
7791
|
+
kind,
|
|
7792
|
+
title,
|
|
7793
|
+
description,
|
|
7794
|
+
lanes,
|
|
7795
|
+
mcp,
|
|
7796
|
+
needs_shell,
|
|
7797
|
+
concepts
|
|
7798
|
+
});
|
|
7799
|
+
function linkedGuides(conceptId) {
|
|
7800
|
+
const byId = new Map(knowledge.guides.map((guide) => [guide.id, guide]));
|
|
7801
|
+
const seen = /* @__PURE__ */ new Set();
|
|
7802
|
+
const examples = [];
|
|
7803
|
+
const docs = [];
|
|
7804
|
+
for (const link of knowledge.links) {
|
|
7805
|
+
if (link.to !== conceptId || seen.has(link.from)) continue;
|
|
7806
|
+
seen.add(link.from);
|
|
7807
|
+
const guide = byId.get(link.from);
|
|
7808
|
+
if (!guide) continue;
|
|
7809
|
+
if (guide.kind === "golden-path")
|
|
7810
|
+
examples.push({ id: guide.id, title: guide.title, mcp: guide.mcp });
|
|
7811
|
+
else
|
|
7812
|
+
docs.push({
|
|
7813
|
+
id: guide.id,
|
|
7814
|
+
title: guide.title,
|
|
7815
|
+
...link.rules ? { rules: link.rules } : {}
|
|
7816
|
+
});
|
|
7817
|
+
}
|
|
7818
|
+
return { examples, docs };
|
|
7819
|
+
}
|
|
7820
|
+
var conceptIndex = /* @__PURE__ */ new Map();
|
|
7821
|
+
for (const concept of knowledge.concepts) {
|
|
7822
|
+
for (const key of [concept.id, concept.name, ...concept.aliases]) {
|
|
7823
|
+
if (!conceptIndex.has(key.toLowerCase()))
|
|
7824
|
+
conceptIndex.set(key.toLowerCase(), concept);
|
|
7825
|
+
}
|
|
7826
|
+
}
|
|
7827
|
+
var conceptKey = (text) => text.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).map(singular).join(" ");
|
|
7828
|
+
var conceptKeyIndex = /* @__PURE__ */ new Map();
|
|
7829
|
+
for (const [key, concept] of conceptIndex) {
|
|
7830
|
+
if (!conceptKeyIndex.has(conceptKey(key)))
|
|
7831
|
+
conceptKeyIndex.set(conceptKey(key), concept);
|
|
7832
|
+
}
|
|
7833
|
+
function resolveConcept(input) {
|
|
7834
|
+
const exact = conceptIndex.get(input.trim().toLowerCase());
|
|
7835
|
+
if (exact) return { concept: exact };
|
|
7836
|
+
const key = conceptKey(input);
|
|
7837
|
+
const plural = conceptKeyIndex.get(key);
|
|
7838
|
+
if (plural) return { concept: plural, matchedAs: key };
|
|
7839
|
+
const budget = typoBudget(key);
|
|
7840
|
+
let best;
|
|
7841
|
+
let tied = false;
|
|
7842
|
+
for (const [candidate, concept] of conceptKeyIndex) {
|
|
7843
|
+
const distance = editDistance(key, candidate, budget);
|
|
7844
|
+
if (distance > budget) continue;
|
|
7845
|
+
if (!best || distance < best.distance) {
|
|
7846
|
+
best = { concept, key: candidate, distance };
|
|
7847
|
+
tied = false;
|
|
7848
|
+
} else if (distance === best.distance && concept.id !== best.concept.id) {
|
|
7849
|
+
tied = true;
|
|
7850
|
+
}
|
|
7851
|
+
}
|
|
7852
|
+
return best && !tied ? { concept: best.concept, matchedAs: best.key } : void 0;
|
|
7853
|
+
}
|
|
7854
|
+
var ruleIndex = /* @__PURE__ */ new Map();
|
|
7855
|
+
for (const concept of knowledge.concepts) {
|
|
7856
|
+
for (const rule of concept.rules) ruleIndex.set(rule.id, { rule, concept });
|
|
7857
|
+
}
|
|
7858
|
+
var source = {
|
|
7859
|
+
plugin_version: knowledge.version,
|
|
7860
|
+
plugin_commit: knowledge.commit
|
|
7861
|
+
};
|
|
7862
|
+
var listGuides = {
|
|
7863
|
+
name: "list-guides",
|
|
7864
|
+
annotations: bundledRead,
|
|
7865
|
+
description: "List the official Runpod guides: skills (how to work with each tool), reference docs (how Runpod works), and golden paths (live-verified end-to-end walkthroughs such as a dev pod, a Whisper endpoint or a fine-tune-to-serverless pipeline). Read one with read-guide. For a golden path, mcp says whether an agent with only these MCP tools can finish it: full (follow it with tool calls), partial (use it for the plan and facts; name the step the user must run in a terminal), none (reference only). Skills and reference docs have mcp null. concepts lists the concept ids it works with (see lookup-concept). Filter with kind, query or concept.",
|
|
7866
|
+
inputSchema: {
|
|
7867
|
+
type: "object",
|
|
7868
|
+
properties: {
|
|
7869
|
+
kind: {
|
|
7870
|
+
type: "string",
|
|
7871
|
+
enum: [...GUIDE_KINDS],
|
|
7872
|
+
description: "Only this kind of guide."
|
|
7873
|
+
},
|
|
7874
|
+
query: {
|
|
7875
|
+
type: "string",
|
|
7876
|
+
description: "Words to match against the id, title and description."
|
|
7877
|
+
},
|
|
7878
|
+
concept: {
|
|
7879
|
+
type: "string",
|
|
7880
|
+
description: 'Only guides linked to this concept id, for example "network-volume".'
|
|
7881
|
+
}
|
|
7882
|
+
},
|
|
7883
|
+
additionalProperties: false
|
|
7884
|
+
},
|
|
7885
|
+
handler: async (_ctx, args) => {
|
|
7886
|
+
const kind = args.kind;
|
|
7887
|
+
const terms = words(String(args.query ?? ""));
|
|
7888
|
+
const concept = args.concept ? String(args.concept).trim() : void 0;
|
|
7889
|
+
const guides = knowledge.guides.filter((guide) => !kind || guide.kind === kind).filter((guide) => !concept || guide.concepts.includes(concept)).filter((guide) => {
|
|
7890
|
+
if (!terms.length) return true;
|
|
7891
|
+
const haystack = `${guide.id} ${guide.title} ${guide.description}`.toLowerCase();
|
|
7892
|
+
return terms.some((term) => haystack.includes(term));
|
|
7893
|
+
}).map(guideSummary);
|
|
7894
|
+
return ok({ ...source, count: guides.length, guides });
|
|
7895
|
+
}
|
|
7896
|
+
};
|
|
7897
|
+
var readGuide = {
|
|
7898
|
+
name: "read-guide",
|
|
7899
|
+
annotations: bundledRead,
|
|
7900
|
+
description: 'Read one official Runpod guide in full, by the id list-guides returns (for example "runpod-usage/storage" or "golden-path/06-dev-pod").',
|
|
7901
|
+
inputSchema: {
|
|
7902
|
+
type: "object",
|
|
7903
|
+
properties: {
|
|
7904
|
+
id: { type: "string", description: "The guide id from list-guides." }
|
|
7905
|
+
},
|
|
7906
|
+
required: ["id"],
|
|
7907
|
+
additionalProperties: false
|
|
7908
|
+
},
|
|
7909
|
+
handler: async (_ctx, args) => {
|
|
7910
|
+
const id = String(args.id).trim();
|
|
7911
|
+
const guide = knowledge.guides.find((candidate) => candidate.id === id);
|
|
7912
|
+
if (!guide) {
|
|
7913
|
+
const close = knowledge.guides.filter(
|
|
7914
|
+
(candidate) => candidate.id.includes(id) || id.includes(candidate.id)
|
|
7915
|
+
).map((candidate) => candidate.id);
|
|
7916
|
+
return {
|
|
7917
|
+
ok: false,
|
|
7918
|
+
status: 404,
|
|
7919
|
+
payload: {
|
|
7920
|
+
error: `No guide with id "${id}".`,
|
|
7921
|
+
hint: close.length ? `Did you mean: ${close.join(", ")}?` : "Call list-guides for the ids."
|
|
7922
|
+
}
|
|
7923
|
+
};
|
|
7924
|
+
}
|
|
7925
|
+
return ok({
|
|
7926
|
+
...source,
|
|
7927
|
+
...guideSummary(guide),
|
|
7928
|
+
parent: guide.parent,
|
|
7929
|
+
path: guide.path,
|
|
7930
|
+
body: guide.body
|
|
7931
|
+
});
|
|
7932
|
+
}
|
|
7933
|
+
};
|
|
7934
|
+
var lookupConcept = {
|
|
7935
|
+
name: "lookup-concept",
|
|
7936
|
+
annotations: bundledRead,
|
|
7937
|
+
description: 'Look up one Runpod concept (pod, network volume, machine, worker, template, \u2026) by id, name or alias; case, plurals and small typos are tolerated, and `matched_as` shows the key used when the match was not exact. Returns its summary, fields, states, relations and rules, each rule with the public source it comes from, the concepts that point at it, and the linked guides: examples (golden paths that use it, with their mcp level) and docs (skills and reference docs that explain it). Use it for exact facts, for example "is a volume disk tied to one machine" or "what happens to a stopped pod\'s GPU".',
|
|
7938
|
+
inputSchema: {
|
|
7939
|
+
type: "object",
|
|
7940
|
+
properties: {
|
|
7941
|
+
concept: {
|
|
7942
|
+
type: "string",
|
|
7943
|
+
description: 'An id, name or alias, such as "pod", "Network volume" or "volume disk".'
|
|
7944
|
+
}
|
|
7945
|
+
},
|
|
7946
|
+
required: ["concept"],
|
|
7947
|
+
additionalProperties: false
|
|
7948
|
+
},
|
|
7949
|
+
handler: async (_ctx, args) => {
|
|
7950
|
+
const resolved = resolveConcept(String(args.concept));
|
|
7951
|
+
if (!resolved) {
|
|
7952
|
+
const ref = conceptKey(String(args.concept));
|
|
7953
|
+
const close = [...conceptKeyIndex.keys()].filter(
|
|
7954
|
+
(key) => key.includes(ref) || editDistance(key, ref, typoBudget(ref) + 1) <= typoBudget(ref) + 1
|
|
7955
|
+
).slice(0, 10);
|
|
7956
|
+
return {
|
|
7957
|
+
ok: false,
|
|
7958
|
+
status: 404,
|
|
7959
|
+
payload: {
|
|
7960
|
+
error: `No concept matches "${args.concept}".`,
|
|
7961
|
+
hint: close.length ? `Close matches: ${close.join(", ")}.` : "Try search-concepts with a few words instead."
|
|
7962
|
+
}
|
|
7963
|
+
};
|
|
7964
|
+
}
|
|
7965
|
+
const { concept, matchedAs } = resolved;
|
|
7966
|
+
const pointedAtBy = knowledge.concepts.flatMap((other) => [
|
|
7967
|
+
...other.is_a === concept.id ? [{ concept: other.id, type: "is_a" }] : [],
|
|
7968
|
+
...other.part_of === concept.id ? [{ concept: other.id, type: "part_of" }] : [],
|
|
7969
|
+
...other.relations.filter((relation) => relation.target === concept.id).map((relation) => ({ concept: other.id, type: relation.type }))
|
|
7970
|
+
]);
|
|
7971
|
+
const linkedRules = [...new Set(concept.rules.flatMap((rule) => rule.see))].map((id) => ruleIndex.get(id)).filter((entry) => entry !== void 0).map(({ rule, concept: owner }) => ({
|
|
7972
|
+
concept: owner.id,
|
|
7973
|
+
id: rule.id,
|
|
7974
|
+
statement: rule.statement.trim()
|
|
7975
|
+
}));
|
|
7976
|
+
return ok({
|
|
7977
|
+
...source,
|
|
7978
|
+
...matchedAs ? { matched_as: matchedAs } : {},
|
|
7979
|
+
...concept,
|
|
7980
|
+
pointed_at_by: pointedAtBy,
|
|
7981
|
+
linked_rules: linkedRules,
|
|
7982
|
+
...linkedGuides(concept.id)
|
|
7983
|
+
});
|
|
7984
|
+
}
|
|
7985
|
+
};
|
|
7986
|
+
var searchConcepts = {
|
|
7987
|
+
name: "search-concepts",
|
|
7988
|
+
annotations: bundledRead,
|
|
7989
|
+
description: 'Search the rules of the Runpod concept graph by words, for example "restart stopped pod no gpu" or "network volume data center". Returns the best-matching rules with their concept and public evidence. Follow up with lookup-concept for the full concept.',
|
|
7990
|
+
inputSchema: {
|
|
7991
|
+
type: "object",
|
|
7992
|
+
properties: {
|
|
7993
|
+
query: {
|
|
7994
|
+
type: "string",
|
|
7995
|
+
description: "A few words describing the question."
|
|
7996
|
+
},
|
|
7997
|
+
limit: {
|
|
7998
|
+
type: "integer",
|
|
7999
|
+
minimum: 1,
|
|
8000
|
+
maximum: 25,
|
|
8001
|
+
description: "Most rules to return. Default 8."
|
|
8002
|
+
}
|
|
8003
|
+
},
|
|
8004
|
+
required: ["query"],
|
|
8005
|
+
additionalProperties: false
|
|
8006
|
+
},
|
|
8007
|
+
handler: async (_ctx, args) => {
|
|
8008
|
+
const terms = words(String(args.query));
|
|
8009
|
+
if (!terms.length) return badRequest("query needs at least one word.");
|
|
8010
|
+
const limit = Math.min(Math.max(Number(args.limit) || 8, 1), 25);
|
|
8011
|
+
const hits = [...ruleIndex.values()].map(({ rule, concept }) => {
|
|
8012
|
+
const statement = words(rule.statement);
|
|
8013
|
+
const names = words(
|
|
8014
|
+
[concept.id, concept.name, ...concept.aliases].join(" ")
|
|
8015
|
+
);
|
|
8016
|
+
const ruleId = words(rule.id);
|
|
8017
|
+
const score = terms.reduce(
|
|
8018
|
+
(total, term) => total + statement.filter((word) => termMatches(word, term)).length + (names.some((name) => nameMatches(name, term)) ? 3 : 0) + (ruleId.includes(term) ? 1 : 0),
|
|
8019
|
+
0
|
|
8020
|
+
);
|
|
8021
|
+
const matched = terms.filter(
|
|
8022
|
+
(term) => statement.some((word) => termMatches(word, term)) || names.some((name) => nameMatches(name, term))
|
|
8023
|
+
).length;
|
|
8024
|
+
return { rule, concept, score: score * matched };
|
|
8025
|
+
}).filter((hit) => hit.score > 0).sort((a, b) => b.score - a.score).slice(0, limit).map(({ rule, concept }) => ({
|
|
8026
|
+
concept: concept.id,
|
|
8027
|
+
concept_name: concept.name,
|
|
8028
|
+
id: rule.id,
|
|
8029
|
+
statement: rule.statement.trim(),
|
|
8030
|
+
status: rule.status,
|
|
8031
|
+
conflict: rule.conflict,
|
|
8032
|
+
evidence: rule.evidence
|
|
8033
|
+
}));
|
|
8034
|
+
return ok({ ...source, count: hits.length, rules: hits });
|
|
8035
|
+
}
|
|
8036
|
+
};
|
|
8037
|
+
var knowledgeTools = [
|
|
8038
|
+
listGuides,
|
|
8039
|
+
readGuide,
|
|
8040
|
+
lookupConcept,
|
|
8041
|
+
searchConcepts
|
|
8042
|
+
];
|
|
8043
|
+
var GUIDE_URI_PREFIX = "runpod://guides/";
|
|
8044
|
+
var guideResources = knowledge.guides.map((guide) => ({
|
|
8045
|
+
uri: `${GUIDE_URI_PREFIX}${guide.id}`,
|
|
8046
|
+
name: guide.id,
|
|
8047
|
+
title: guide.title,
|
|
8048
|
+
description: guide.description,
|
|
8049
|
+
mimeType: "text/markdown",
|
|
8050
|
+
text: guide.body
|
|
8051
|
+
}));
|
|
8052
|
+
|
|
6946
8053
|
// src/specgen/analytics.ts
|
|
6947
8054
|
import { createHmac } from "crypto";
|
|
6948
8055
|
var CAPTURE_TIMEOUT_MS = 3e3;
|
|
@@ -7357,6 +8464,7 @@ function createAlpTools(opts) {
|
|
|
7357
8464
|
// is ignored, never a 400 that derails the task the agent is actually on.
|
|
7358
8465
|
lenientArguments: true,
|
|
7359
8466
|
name: "report_feedback",
|
|
8467
|
+
annotations: write,
|
|
7360
8468
|
description: "Report a problem or friction with Runpod or these tools: a wrong result, a confusing error, a docs gap, an API behavior that surprised you. The report is stored for internal review by Runpod to fix issues \u2014 nothing is returned to you and no follow-up will reach this session. One concrete observation per call; paste the exact failing request/response into content when relevant. Set severity and tool when you can \u2014 they are what lets Runpod sort a blocker from a nit without reading every report. Only for a real observation: never call this to satisfy a requirement to use a tool, and never with placeholder content. Never include API keys or secrets.",
|
|
7361
8469
|
inputSchema: alpInputSchema(
|
|
7362
8470
|
"The observation: what happened, what you expected, and the exact error or response text if you have it.",
|
|
@@ -7392,6 +8500,7 @@ function createAlpTools(opts) {
|
|
|
7392
8500
|
// is ignored, never a 400 that derails the task the agent is actually on.
|
|
7393
8501
|
lenientArguments: true,
|
|
7394
8502
|
name: "save_to_journal",
|
|
8503
|
+
annotations: write,
|
|
7395
8504
|
description: "Save something you learned about using Runpod that a future session would benefit from (e.g. 'image X needs CUDA 12.8', 'endpoint type cannot be changed after create'). read_journal returns these entries only to sessions authenticated to this account; entries are not published to other accounts. Runpod stores and reviews submissions to improve agent workflows. Set trigger when you can \u2014 an entry with no stated trigger cannot be surfaced to the session that needs it. Never include API keys or secrets.",
|
|
7396
8505
|
inputSchema: alpInputSchema(
|
|
7397
8506
|
"The learning, stated so a future agent can act on it: the situation, what turned out to be true, and how you verified it.",
|
|
@@ -7422,6 +8531,7 @@ function createAlpTools(opts) {
|
|
|
7422
8531
|
// is ignored, never a 400 that derails the task the agent is actually on.
|
|
7423
8532
|
lenientArguments: true,
|
|
7424
8533
|
name: "ask_question",
|
|
8534
|
+
annotations: write,
|
|
7425
8535
|
description: "Record a question about Runpod that you could not answer with the available tools, skills, and docs. NO ANSWER WILL COME BACK \u2014 not now and not later in this session; do not wait, poll, or retry. Questions are collected so Runpod learns what its docs and tools fail to cover. Ask when genuinely stuck (it costs one call and improves what future agents get), then consult the runpod://skills/ resources and continue with your best judgment. Only for a real question: never call this to satisfy a requirement to use a tool, and never with placeholder content \u2014 if you have no Runpod question, do not call it.",
|
|
7426
8536
|
inputSchema: alpInputSchema(
|
|
7427
8537
|
"The question, with enough context that someone reading it later understands what you were blocked on.",
|
|
@@ -7446,6 +8556,7 @@ function createAlpTools(opts) {
|
|
|
7446
8556
|
const readJournalTool = {
|
|
7447
8557
|
lenientArguments: true,
|
|
7448
8558
|
name: "read_journal",
|
|
8559
|
+
annotations: readOnly,
|
|
7449
8560
|
description: "Read back this account's private journal: the lessons earlier sessions on this account saved with save_to_journal, newest first. Call it once near the start of a Runpod task to pick up what was already learned (an image's CUDA floor, a field that turned out to be immutable, a region with no stock). Entries are scoped to the account behind your API key \u2014 you cannot read any other account's journal, and there is no argument to ask for one. Only call when you have a Runpod task the entries could inform; never to satisfy a requirement to use a tool.",
|
|
7450
8561
|
inputSchema: {
|
|
7451
8562
|
type: "object",
|
|
@@ -7496,7 +8607,8 @@ var curatedTools = [
|
|
|
7496
8607
|
getCapacity,
|
|
7497
8608
|
...hubTools,
|
|
7498
8609
|
setEndpointGpus,
|
|
7499
|
-
listPublicEndpoints
|
|
8610
|
+
listPublicEndpoints,
|
|
8611
|
+
...knowledgeTools
|
|
7500
8612
|
];
|
|
7501
8613
|
var SERVER_INSTRUCTIONS = `These tools cover the Runpod v2 REST surface: compute catalog (GPUs, CPUs, data centers, capacity), pods, serverless endpoints and jobs, templates, network volumes, container registries, billing, public endpoints, and the Hub.
|
|
7502
8614
|
|
|
@@ -7508,6 +8620,8 @@ Mutations cost money and bind to what this conversation created. State the hourl
|
|
|
7508
8620
|
|
|
7509
8621
|
These tools manage infrastructure only. They do not do SSH sessions, file transfer to or from pods, local image builds, or interactive terminals \u2014 say plainly when a task needs one of those and name the real path (the Runpod console, runpodctl) instead of improvising.
|
|
7510
8622
|
|
|
8623
|
+
OFFICIAL GUIDES AND FACTS. list-guides and read-guide serve the official Runpod plugin's skills, reference docs and live-verified golden paths, so you have them even without the plugin installed. For a multi-step or billable task, look for a matching golden path first. lookup-concept and search-concepts answer exact questions about how Runpod works (what a stopped pod keeps, where a volume lives) with the public source for each fact.
|
|
8624
|
+
|
|
7511
8625
|
SKILLS \u2014 READ BEFORE ACTING. This server publishes its task playbooks as MCP resources under runpod://skills/. Before the FIRST Runpod tool call of a session, read runpod://skills/runpod (the router): it maps the request to a journey skill \u2014 deploying an endpoint reads runpod://skills/serverless-deploy, diagnosing a broken pod reads runpod://skills/pod-doctor, cost questions read runpod://skills/cost-audit, and so on \u2014 and each journey skill carries the procedure, pitfalls, and report format for that task. A reply produced without the routed skill loaded is out of contract. List them all with resources/list.
|
|
7512
8626
|
|
|
7513
8627
|
THE OFFICIAL RUNPOD PLUGIN. Runpod ships an agent plugin that covers the lanes these resources do not: the runpodctl and flash CLIs, image builds and model downloads, the official pod templates, and verified end-to-end golden paths. Check once per session whether skills named runpod, runpod-usage, or runpodctl are available to you \u2014 read what you already have, never shell out to look. If they are there, prefer them for procedure and lane choice and treat runpod://skills/ as the fallback. If you do not see them, recommend the plugin to the user, and recommend updating to the latest if what they have is missing something you need. Point them at https://github.com/runpod/runpod-plugins-official \u2014 its README carries the install, update, and clone commands for each client, so read it yourself when you need the exact one rather than guessing a command. This is a recommendation, never a prerequisite: make it once, briefly, and get on with the task. Either way this server is the source of truth for its OWN tool surface: the live tool schemas and the runpod:// resources override any Runpod tool list written down elsewhere, the plugin's included.
|
|
@@ -7539,32 +8653,56 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
7539
8653
|
};
|
|
7540
8654
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
7541
8655
|
tools: [
|
|
7542
|
-
...servedCuratedTools.map(
|
|
7543
|
-
name,
|
|
7544
|
-
|
|
7545
|
-
|
|
7546
|
-
|
|
7547
|
-
|
|
7548
|
-
|
|
7549
|
-
|
|
7550
|
-
|
|
7551
|
-
|
|
8656
|
+
...servedCuratedTools.map(
|
|
8657
|
+
({ name, description, inputSchema, annotations }) => ({
|
|
8658
|
+
name,
|
|
8659
|
+
description,
|
|
8660
|
+
inputSchema,
|
|
8661
|
+
annotations
|
|
8662
|
+
})
|
|
8663
|
+
),
|
|
8664
|
+
...generatedTools.map(
|
|
8665
|
+
({ name, description, inputSchema, annotations }) => ({
|
|
8666
|
+
name,
|
|
8667
|
+
description,
|
|
8668
|
+
inputSchema,
|
|
8669
|
+
annotations
|
|
8670
|
+
})
|
|
8671
|
+
)
|
|
7552
8672
|
]
|
|
7553
8673
|
}));
|
|
7554
8674
|
const SKILL_URI_PREFIX = "runpod://skills/";
|
|
7555
8675
|
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
7556
|
-
resources:
|
|
7557
|
-
|
|
7558
|
-
|
|
7559
|
-
|
|
7560
|
-
|
|
7561
|
-
|
|
7562
|
-
|
|
8676
|
+
resources: [
|
|
8677
|
+
...skillDocs.map((skill) => ({
|
|
8678
|
+
uri: `${SKILL_URI_PREFIX}${skill.name}`,
|
|
8679
|
+
name: skill.name,
|
|
8680
|
+
title: `Runpod skill: ${skill.name}`,
|
|
8681
|
+
description: skill.description,
|
|
8682
|
+
mimeType: "text/markdown"
|
|
8683
|
+
})),
|
|
8684
|
+
...guideResources.map(({ text: _text, ...resource }) => resource)
|
|
8685
|
+
]
|
|
7563
8686
|
}));
|
|
7564
8687
|
server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({
|
|
7565
8688
|
resourceTemplates: []
|
|
7566
8689
|
}));
|
|
7567
8690
|
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
8691
|
+
if (request.params.uri.startsWith(GUIDE_URI_PREFIX)) {
|
|
8692
|
+
const guide = guideResources.find(
|
|
8693
|
+
(candidate) => candidate.uri === request.params.uri
|
|
8694
|
+
);
|
|
8695
|
+
if (!guide) {
|
|
8696
|
+
throw new Error(
|
|
8697
|
+
`Unknown resource ${request.params.uri}. Call list-guides for the guide ids.`
|
|
8698
|
+
);
|
|
8699
|
+
}
|
|
8700
|
+
return {
|
|
8701
|
+
contents: [
|
|
8702
|
+
{ uri: guide.uri, mimeType: "text/markdown", text: guide.text }
|
|
8703
|
+
]
|
|
8704
|
+
};
|
|
8705
|
+
}
|
|
7568
8706
|
const name = request.params.uri.startsWith(SKILL_URI_PREFIX) ? request.params.uri.slice(SKILL_URI_PREFIX.length) : void 0;
|
|
7569
8707
|
const skill = skillDocs.find((candidate) => candidate.name === name);
|
|
7570
8708
|
if (!skill) {
|