@runpod/mcp-server 4.9.1 → 4.10.1
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 +35 -0
- package/README.md +2 -11
- package/dist/alp.cjs +21 -2
- package/dist/alp.cjs.map +1 -1
- package/dist/alp.d.cts +2 -1
- package/dist/alp.d.ts +2 -1
- package/dist/alp.mjs +3 -1
- package/dist/{chunk-N4OSRS4A.mjs → chunk-AKX5ZMCL.mjs} +1931 -221
- package/dist/chunk-AKX5ZMCL.mjs.map +1 -0
- package/dist/{chunk-6IETGSON.mjs → chunk-FQJFKWUV.mjs} +32 -1
- package/dist/chunk-FQJFKWUV.mjs.map +1 -0
- package/dist/{chunk-H3NZYQIB.mjs → chunk-WWXM5EES.mjs} +20 -3
- package/dist/chunk-WWXM5EES.mjs.map +1 -0
- package/dist/hosted.cjs +1986 -217
- package/dist/hosted.cjs.map +1 -1
- package/dist/hosted.mjs +16 -5
- package/dist/hosted.mjs.map +1 -1
- package/dist/http.cjs +1960 -219
- package/dist/http.cjs.map +1 -1
- package/dist/http.mjs +2 -2
- package/dist/specgen/profile.cjs +31 -0
- package/dist/specgen/profile.cjs.map +1 -1
- package/dist/specgen/profile.mjs +1 -1
- package/dist/stdio.cjs +1960 -219
- package/dist/stdio.cjs.map +1 -1
- package/dist/stdio.mjs +1960 -219
- package/dist/stdio.mjs.map +1 -1
- package/package.json +4 -3
- package/dist/chunk-6IETGSON.mjs.map +0 -1
- package/dist/chunk-H3NZYQIB.mjs.map +0 -1
- package/dist/chunk-N4OSRS4A.mjs.map +0 -1
package/dist/stdio.mjs
CHANGED
|
@@ -12,7 +12,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
12
12
|
|
|
13
13
|
// src/server.ts
|
|
14
14
|
var SERVER_NAME = "Runpod API Server";
|
|
15
|
-
var SERVER_VERSION = true ? "4.
|
|
15
|
+
var SERVER_VERSION = true ? "4.10.1" : "dev";
|
|
16
16
|
|
|
17
17
|
// src/specgen/server.ts
|
|
18
18
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -219,6 +219,14 @@ function validateArguments(inputSchema, args) {
|
|
|
219
219
|
}
|
|
220
220
|
return null;
|
|
221
221
|
}
|
|
222
|
+
function withoutNullOptionals(inputSchema, args) {
|
|
223
|
+
const required = new Set(inputSchema.required ?? []);
|
|
224
|
+
return Object.fromEntries(
|
|
225
|
+
Object.entries(args).filter(
|
|
226
|
+
([name, value]) => value !== null || required.has(name)
|
|
227
|
+
)
|
|
228
|
+
);
|
|
229
|
+
}
|
|
222
230
|
async function dispatchGeneratedTool(client, tool, args) {
|
|
223
231
|
const rejected = validateArguments(tool.inputSchema, args);
|
|
224
232
|
if (rejected) return rejected;
|
|
@@ -343,6 +351,104 @@ function coerceScalars(value, schema, defs, depth = 0) {
|
|
|
343
351
|
|
|
344
352
|
// src/specgen/generated/tools.gen.ts
|
|
345
353
|
var generatedTools = [
|
|
354
|
+
{
|
|
355
|
+
name: "add-organization-group-member",
|
|
356
|
+
title: "Add organization group member",
|
|
357
|
+
operationId: "addOrganizationGroupMember",
|
|
358
|
+
description: "Add a member to a group. Adds the organization member to the group. The group and user must belong to the current organization. Adding an existing member is idempotent and returns the same no-content response.",
|
|
359
|
+
method: "PUT",
|
|
360
|
+
path: "/v2/organization/groups/{id}/members/{userId}",
|
|
361
|
+
params: [
|
|
362
|
+
{
|
|
363
|
+
name: "id",
|
|
364
|
+
location: "path"
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
name: "userId",
|
|
368
|
+
location: "path"
|
|
369
|
+
}
|
|
370
|
+
],
|
|
371
|
+
hasBody: false,
|
|
372
|
+
annotations: {
|
|
373
|
+
readOnlyHint: false,
|
|
374
|
+
destructiveHint: false,
|
|
375
|
+
idempotentHint: true,
|
|
376
|
+
openWorldHint: true
|
|
377
|
+
},
|
|
378
|
+
inputSchema: {
|
|
379
|
+
type: "object",
|
|
380
|
+
properties: {
|
|
381
|
+
id: {
|
|
382
|
+
type: "string",
|
|
383
|
+
minLength: 1,
|
|
384
|
+
description: "Group ID."
|
|
385
|
+
},
|
|
386
|
+
userId: {
|
|
387
|
+
type: "string",
|
|
388
|
+
minLength: 1,
|
|
389
|
+
description: "Organization member user ID."
|
|
390
|
+
}
|
|
391
|
+
},
|
|
392
|
+
required: ["id", "userId"]
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
name: "attach-cost-center-resource",
|
|
397
|
+
title: "Attach cost center resource",
|
|
398
|
+
operationId: "attachCostCenterResource",
|
|
399
|
+
description: "Attribute a resource to a cost center. Attributes a resource to a cost center. Repeating the request is a no-op. A resource belongs to at most one cost center; one already attributed elsewhere is rejected with 409 rather than moved.",
|
|
400
|
+
method: "PUT",
|
|
401
|
+
path: "/v2/cost-centers/{id}/{resourceType}/{resourceId}",
|
|
402
|
+
params: [
|
|
403
|
+
{
|
|
404
|
+
name: "id",
|
|
405
|
+
location: "path"
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
name: "resourceType",
|
|
409
|
+
location: "path"
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
name: "resourceId",
|
|
413
|
+
location: "path"
|
|
414
|
+
}
|
|
415
|
+
],
|
|
416
|
+
hasBody: false,
|
|
417
|
+
annotations: {
|
|
418
|
+
readOnlyHint: false,
|
|
419
|
+
destructiveHint: false,
|
|
420
|
+
idempotentHint: true,
|
|
421
|
+
openWorldHint: true
|
|
422
|
+
},
|
|
423
|
+
inputSchema: {
|
|
424
|
+
type: "object",
|
|
425
|
+
properties: {
|
|
426
|
+
id: {
|
|
427
|
+
type: "string",
|
|
428
|
+
minLength: 1,
|
|
429
|
+
description: "Cost center identifier."
|
|
430
|
+
},
|
|
431
|
+
resourceType: {
|
|
432
|
+
$ref: "#/$defs/ResourceType",
|
|
433
|
+
description: "Kind of resource.",
|
|
434
|
+
type: "string"
|
|
435
|
+
},
|
|
436
|
+
resourceId: {
|
|
437
|
+
type: "string",
|
|
438
|
+
minLength: 1,
|
|
439
|
+
description: "Resource identifier."
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
required: ["id", "resourceType", "resourceId"],
|
|
443
|
+
$defs: {
|
|
444
|
+
ResourceType: {
|
|
445
|
+
type: "string",
|
|
446
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
447
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
},
|
|
346
452
|
{
|
|
347
453
|
name: "create-cluster",
|
|
348
454
|
title: "Create cluster",
|
|
@@ -441,7 +547,6 @@ var generatedTools = [
|
|
|
441
547
|
},
|
|
442
548
|
network: {
|
|
443
549
|
type: "array",
|
|
444
|
-
maxItems: 1,
|
|
445
550
|
items: {
|
|
446
551
|
$ref: "#/$defs/NetworkMount"
|
|
447
552
|
}
|
|
@@ -463,7 +568,7 @@ var generatedTools = [
|
|
|
463
568
|
gpuCountPerPod: {
|
|
464
569
|
type: "integer",
|
|
465
570
|
minimum: 1,
|
|
466
|
-
description: "Number of GPUs on each pod. Bounded above by the GPU type's per-cloud maximum (GpuType.maxCount);
|
|
571
|
+
description: "Number of GPUs on each pod. Bounded above by the GPU type's per-cloud maximum (GpuType.maxCount); values beyond it are rejected.",
|
|
467
572
|
examples: [8]
|
|
468
573
|
},
|
|
469
574
|
podCount: {
|
|
@@ -476,7 +581,7 @@ var generatedTools = [
|
|
|
476
581
|
}
|
|
477
582
|
},
|
|
478
583
|
ClusterMounts: {
|
|
479
|
-
description: "Storage mounts for a cluster create: `persistent` or `network
|
|
584
|
+
description: "Storage mounts for a cluster create: `persistent` or one `network` volume, not both. Clusters cannot mount global volumes, so `global` is rejected.",
|
|
480
585
|
"x-go-type": "BaseMounts",
|
|
481
586
|
allOf: [
|
|
482
587
|
{
|
|
@@ -496,6 +601,7 @@ var generatedTools = [
|
|
|
496
601
|
},
|
|
497
602
|
network: {
|
|
498
603
|
type: "array",
|
|
604
|
+
maxItems: 1,
|
|
499
605
|
items: {
|
|
500
606
|
type: "object",
|
|
501
607
|
properties: {
|
|
@@ -574,7 +680,7 @@ var generatedTools = [
|
|
|
574
680
|
type: "object",
|
|
575
681
|
required: ["volumeId", "path"],
|
|
576
682
|
additionalProperties: false,
|
|
577
|
-
description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods.
|
|
683
|
+
description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods. On a pod, the volume can be mounted, moved, or unmounted after creation (see `UpdatePodMounts`).",
|
|
578
684
|
properties: {
|
|
579
685
|
volumeId: {
|
|
580
686
|
type: "string",
|
|
@@ -597,7 +703,7 @@ var generatedTools = [
|
|
|
597
703
|
size: {
|
|
598
704
|
type: "integer",
|
|
599
705
|
minimum: 10,
|
|
600
|
-
description: "Host-local persistent storage in GB.
|
|
706
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
601
707
|
examples: [20]
|
|
602
708
|
},
|
|
603
709
|
path: {
|
|
@@ -610,6 +716,77 @@ var generatedTools = [
|
|
|
610
716
|
}
|
|
611
717
|
}
|
|
612
718
|
},
|
|
719
|
+
{
|
|
720
|
+
name: "create-cost-center",
|
|
721
|
+
title: "Create cost center",
|
|
722
|
+
operationId: "createCostCenter",
|
|
723
|
+
description: "Create a cost center. Creates a cost center \u2014 a named label that groups resource spend so it can be broken out in billing. Pass `resources` to attribute resources at creation time; attaching is all-or-nothing, and a resource that already belongs to another cost center is rejected rather than moved.",
|
|
724
|
+
method: "POST",
|
|
725
|
+
path: "/v2/cost-centers",
|
|
726
|
+
params: [],
|
|
727
|
+
hasBody: true,
|
|
728
|
+
annotations: {
|
|
729
|
+
readOnlyHint: false,
|
|
730
|
+
destructiveHint: false,
|
|
731
|
+
idempotentHint: false,
|
|
732
|
+
openWorldHint: true
|
|
733
|
+
},
|
|
734
|
+
inputSchema: {
|
|
735
|
+
type: "object",
|
|
736
|
+
properties: {
|
|
737
|
+
body: {
|
|
738
|
+
$ref: "#/$defs/CreateCostCenterRequest",
|
|
739
|
+
type: "object"
|
|
740
|
+
}
|
|
741
|
+
},
|
|
742
|
+
required: ["body"],
|
|
743
|
+
$defs: {
|
|
744
|
+
CostCenterResource: {
|
|
745
|
+
type: "object",
|
|
746
|
+
additionalProperties: false,
|
|
747
|
+
required: ["id", "type"],
|
|
748
|
+
properties: {
|
|
749
|
+
id: {
|
|
750
|
+
type: "string",
|
|
751
|
+
minLength: 1,
|
|
752
|
+
examples: ["p9k2m4n6q8"]
|
|
753
|
+
},
|
|
754
|
+
type: {
|
|
755
|
+
$ref: "#/$defs/ResourceType"
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
},
|
|
759
|
+
CreateCostCenterRequest: {
|
|
760
|
+
type: "object",
|
|
761
|
+
additionalProperties: false,
|
|
762
|
+
required: ["value"],
|
|
763
|
+
properties: {
|
|
764
|
+
value: {
|
|
765
|
+
type: "string",
|
|
766
|
+
minLength: 1,
|
|
767
|
+
maxLength: 50,
|
|
768
|
+
pattern: "^\\s*\\S",
|
|
769
|
+
description: "Leading and trailing whitespace is trimmed.",
|
|
770
|
+
examples: ["team-ml"]
|
|
771
|
+
},
|
|
772
|
+
resources: {
|
|
773
|
+
type: "array",
|
|
774
|
+
description: "Resources to attribute to the new cost center.",
|
|
775
|
+
maxItems: 100,
|
|
776
|
+
items: {
|
|
777
|
+
$ref: "#/$defs/CostCenterResource"
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
ResourceType: {
|
|
783
|
+
type: "string",
|
|
784
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
785
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
},
|
|
613
790
|
{
|
|
614
791
|
name: "create-delegation",
|
|
615
792
|
title: "Create ECR delegation",
|
|
@@ -1138,6 +1315,7 @@ var generatedTools = [
|
|
|
1138
1315
|
type: "string",
|
|
1139
1316
|
minLength: 1,
|
|
1140
1317
|
maxLength: 191,
|
|
1318
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
1141
1319
|
description: "Human-readable name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed.",
|
|
1142
1320
|
examples: ["training-data"]
|
|
1143
1321
|
}
|
|
@@ -1213,6 +1391,169 @@ var generatedTools = [
|
|
|
1213
1391
|
}
|
|
1214
1392
|
}
|
|
1215
1393
|
},
|
|
1394
|
+
{
|
|
1395
|
+
name: "create-organization-group",
|
|
1396
|
+
title: "Create organization group",
|
|
1397
|
+
operationId: "createOrganizationGroup",
|
|
1398
|
+
description: "Create a group in your current organization",
|
|
1399
|
+
method: "POST",
|
|
1400
|
+
path: "/v2/organization/groups",
|
|
1401
|
+
params: [],
|
|
1402
|
+
hasBody: true,
|
|
1403
|
+
annotations: {
|
|
1404
|
+
readOnlyHint: false,
|
|
1405
|
+
destructiveHint: false,
|
|
1406
|
+
idempotentHint: false,
|
|
1407
|
+
openWorldHint: true
|
|
1408
|
+
},
|
|
1409
|
+
inputSchema: {
|
|
1410
|
+
type: "object",
|
|
1411
|
+
properties: {
|
|
1412
|
+
body: {
|
|
1413
|
+
$ref: "#/$defs/CreateOrganizationGroupRequest",
|
|
1414
|
+
type: "object"
|
|
1415
|
+
}
|
|
1416
|
+
},
|
|
1417
|
+
required: ["body"],
|
|
1418
|
+
$defs: {
|
|
1419
|
+
CreateOrganizationGroupRequest: {
|
|
1420
|
+
type: "object",
|
|
1421
|
+
additionalProperties: false,
|
|
1422
|
+
required: ["name"],
|
|
1423
|
+
properties: {
|
|
1424
|
+
name: {
|
|
1425
|
+
type: "string",
|
|
1426
|
+
minLength: 1,
|
|
1427
|
+
maxLength: 191,
|
|
1428
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
1429
|
+
description: "Group name with at least one non-whitespace character; surrounding whitespace is trimmed.",
|
|
1430
|
+
examples: ["Engineering"]
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
}
|
|
1436
|
+
},
|
|
1437
|
+
{
|
|
1438
|
+
name: "create-organization-invite",
|
|
1439
|
+
title: "Create organization invite",
|
|
1440
|
+
operationId: "createOrganizationInvite",
|
|
1441
|
+
description: "Invite a user to your organization. Sends an invitation to join the authenticated caller's organization and returns the pending invite; `expiresAt` is when it lapses. The invitee receives an email carrying the acceptance link, which is never returned here. Returns 409 when the address already belongs to a member or to a pending invite, or when the organization has reached its pending-invite limit; 404 when the role is unknown to the organization; and 403 when the caller does not hold every capability the role grants. Inviting requires the organization's invite-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
|
|
1442
|
+
method: "POST",
|
|
1443
|
+
path: "/v2/organization/invites",
|
|
1444
|
+
params: [],
|
|
1445
|
+
hasBody: true,
|
|
1446
|
+
annotations: {
|
|
1447
|
+
readOnlyHint: false,
|
|
1448
|
+
destructiveHint: false,
|
|
1449
|
+
idempotentHint: false,
|
|
1450
|
+
openWorldHint: true
|
|
1451
|
+
},
|
|
1452
|
+
inputSchema: {
|
|
1453
|
+
type: "object",
|
|
1454
|
+
properties: {
|
|
1455
|
+
body: {
|
|
1456
|
+
$ref: "#/$defs/CreateOrganizationInviteRequest",
|
|
1457
|
+
type: "object"
|
|
1458
|
+
}
|
|
1459
|
+
},
|
|
1460
|
+
required: ["body"],
|
|
1461
|
+
$defs: {
|
|
1462
|
+
CreateOrganizationInviteRequest: {
|
|
1463
|
+
type: "object",
|
|
1464
|
+
additionalProperties: false,
|
|
1465
|
+
required: ["email", "role"],
|
|
1466
|
+
properties: {
|
|
1467
|
+
email: {
|
|
1468
|
+
type: "string",
|
|
1469
|
+
format: "email",
|
|
1470
|
+
minLength: 1,
|
|
1471
|
+
maxLength: 254,
|
|
1472
|
+
description: "Address to invite, stored lowercased. The invitee accepts by signing in with a verified account on this address.",
|
|
1473
|
+
examples: ["new-member@example.com"]
|
|
1474
|
+
},
|
|
1475
|
+
role: {
|
|
1476
|
+
$ref: "#/$defs/OrganizationRoleInput"
|
|
1477
|
+
}
|
|
1478
|
+
}
|
|
1479
|
+
},
|
|
1480
|
+
OrganizationRoleInput: {
|
|
1481
|
+
type: "object",
|
|
1482
|
+
description: "An organization role to assign, by ID.",
|
|
1483
|
+
additionalProperties: false,
|
|
1484
|
+
required: ["id"],
|
|
1485
|
+
properties: {
|
|
1486
|
+
id: {
|
|
1487
|
+
type: "string",
|
|
1488
|
+
minLength: 1,
|
|
1489
|
+
description: "Role ID, as reported on a member or an invite: `builtin:admin`, `builtin:dev`, `builtin:billing`, `builtin:basic`, or a custom role's own ID.",
|
|
1490
|
+
examples: ["builtin:dev"]
|
|
1491
|
+
}
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
},
|
|
1497
|
+
{
|
|
1498
|
+
name: "create-organization-role",
|
|
1499
|
+
title: "Create organization role",
|
|
1500
|
+
operationId: "createOrganizationRole",
|
|
1501
|
+
description: "Create a custom organization role. Creates a custom role in the authenticated caller's organization and returns it. Returns 409 when the organization already has a role with this name or has reached its custom-role limit; 422 when a capability is unknown or the name is reserved; and 403 when the caller does not hold every capability the role grants. Creating roles requires the organization's role-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
|
|
1502
|
+
method: "POST",
|
|
1503
|
+
path: "/v2/organization/roles",
|
|
1504
|
+
params: [],
|
|
1505
|
+
hasBody: true,
|
|
1506
|
+
annotations: {
|
|
1507
|
+
readOnlyHint: false,
|
|
1508
|
+
destructiveHint: false,
|
|
1509
|
+
idempotentHint: false,
|
|
1510
|
+
openWorldHint: true
|
|
1511
|
+
},
|
|
1512
|
+
inputSchema: {
|
|
1513
|
+
type: "object",
|
|
1514
|
+
properties: {
|
|
1515
|
+
body: {
|
|
1516
|
+
$ref: "#/$defs/CreateOrganizationRoleRequest",
|
|
1517
|
+
type: "object"
|
|
1518
|
+
}
|
|
1519
|
+
},
|
|
1520
|
+
required: ["body"],
|
|
1521
|
+
$defs: {
|
|
1522
|
+
CreateOrganizationRoleRequest: {
|
|
1523
|
+
type: "object",
|
|
1524
|
+
additionalProperties: false,
|
|
1525
|
+
required: ["name", "capabilities"],
|
|
1526
|
+
properties: {
|
|
1527
|
+
name: {
|
|
1528
|
+
$ref: "#/$defs/OrganizationRoleName"
|
|
1529
|
+
},
|
|
1530
|
+
capabilities: {
|
|
1531
|
+
$ref: "#/$defs/OrganizationRoleCapabilitiesInput"
|
|
1532
|
+
}
|
|
1533
|
+
}
|
|
1534
|
+
},
|
|
1535
|
+
OrganizationRoleCapabilitiesInput: {
|
|
1536
|
+
type: "array",
|
|
1537
|
+
description: "What the role grants, as `FAMILY:VERB` capabilities from `get-organization-role-capabilities`. The caller must hold every capability it lists.",
|
|
1538
|
+
minItems: 1,
|
|
1539
|
+
uniqueItems: true,
|
|
1540
|
+
items: {
|
|
1541
|
+
type: "string",
|
|
1542
|
+
pattern: "^[A-Z0-9_]+:[A-Z0-9_]+$"
|
|
1543
|
+
},
|
|
1544
|
+
examples: [["POD:VIEW"]]
|
|
1545
|
+
},
|
|
1546
|
+
OrganizationRoleName: {
|
|
1547
|
+
type: "string",
|
|
1548
|
+
minLength: 1,
|
|
1549
|
+
maxLength: 191,
|
|
1550
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
1551
|
+
description: "Display name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed. It must be unique within the organization and cannot be a built-in role's name.",
|
|
1552
|
+
examples: ["Pod viewer"]
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1556
|
+
},
|
|
1216
1557
|
{
|
|
1217
1558
|
name: "create-pod",
|
|
1218
1559
|
title: "Create Pod",
|
|
@@ -1333,6 +1674,7 @@ var generatedTools = [
|
|
|
1333
1674
|
count: {
|
|
1334
1675
|
type: "integer",
|
|
1335
1676
|
minimum: 1,
|
|
1677
|
+
maximum: 1024,
|
|
1336
1678
|
default: 1,
|
|
1337
1679
|
description: "Number of GPUs",
|
|
1338
1680
|
examples: [1]
|
|
@@ -1347,7 +1689,6 @@ var generatedTools = [
|
|
|
1347
1689
|
},
|
|
1348
1690
|
network: {
|
|
1349
1691
|
type: "array",
|
|
1350
|
-
maxItems: 1,
|
|
1351
1692
|
items: {
|
|
1352
1693
|
$ref: "#/$defs/NetworkMount"
|
|
1353
1694
|
}
|
|
@@ -1411,12 +1752,14 @@ var generatedTools = [
|
|
|
1411
1752
|
minRamPerGpu: {
|
|
1412
1753
|
type: "integer",
|
|
1413
1754
|
minimum: 1,
|
|
1755
|
+
maximum: 65536,
|
|
1414
1756
|
description: "Minimum host system RAM in GB per requested GPU. This is a placement filter, not a resource request. The actual total allocated system RAM may be higher and is returned in gpu.memory.",
|
|
1415
1757
|
examples: [8]
|
|
1416
1758
|
},
|
|
1417
1759
|
minVcpuCountPerGpu: {
|
|
1418
1760
|
type: "integer",
|
|
1419
1761
|
minimum: 1,
|
|
1762
|
+
maximum: 4096,
|
|
1420
1763
|
description: "Minimum host vCPU count per requested GPU. This is a placement filter, not a resource request. The actual total allocated vCPU count may be higher and is returned in gpu.vcpuCount.",
|
|
1421
1764
|
examples: [2]
|
|
1422
1765
|
}
|
|
@@ -1507,7 +1850,7 @@ var generatedTools = [
|
|
|
1507
1850
|
type: "object",
|
|
1508
1851
|
required: ["volumeId"],
|
|
1509
1852
|
additionalProperties: false,
|
|
1510
|
-
description: "Reference to a GlobalVolume. Usage-billed, so it has no size.
|
|
1853
|
+
description: "Reference to a GlobalVolume. Usage-billed, so it has no size. On a pod, the volume can be mounted, moved, or unmounted after creation (see `UpdatePodMounts`).",
|
|
1511
1854
|
properties: {
|
|
1512
1855
|
volumeId: {
|
|
1513
1856
|
type: "string",
|
|
@@ -1516,7 +1859,7 @@ var generatedTools = [
|
|
|
1516
1859
|
},
|
|
1517
1860
|
path: {
|
|
1518
1861
|
type: "string",
|
|
1519
|
-
description: "Mount path inside the container. Optional
|
|
1862
|
+
description: "Mount path inside the container. Optional; a default is chosen for you when omitted.",
|
|
1520
1863
|
examples: ["/data"]
|
|
1521
1864
|
}
|
|
1522
1865
|
}
|
|
@@ -1530,10 +1873,18 @@ var generatedTools = [
|
|
|
1530
1873
|
{
|
|
1531
1874
|
type: "object",
|
|
1532
1875
|
properties: {
|
|
1876
|
+
network: {
|
|
1877
|
+
type: "array",
|
|
1878
|
+
maxItems: 4,
|
|
1879
|
+
description: "Up to 4 network volumes, all in the pod's data center.",
|
|
1880
|
+
items: {
|
|
1881
|
+
$ref: "#/$defs/NetworkMount"
|
|
1882
|
+
}
|
|
1883
|
+
},
|
|
1533
1884
|
global: {
|
|
1534
1885
|
type: "array",
|
|
1535
1886
|
maxItems: 1,
|
|
1536
|
-
description: "At most one global volume, on GPU and CPU pods, with no data center constraint. Combinable with `network` but not with `persistent` (rejected):
|
|
1887
|
+
description: "At most one global volume, on GPU and CPU pods, with no data center constraint. Combinable with `network` but not with `persistent` (rejected): a persistent disk is dropped whenever a volume is attached. Same PATCH rules as `network`.",
|
|
1537
1888
|
items: {
|
|
1538
1889
|
$ref: "#/$defs/GlobalMount"
|
|
1539
1890
|
}
|
|
@@ -1547,7 +1898,7 @@ var generatedTools = [
|
|
|
1547
1898
|
type: "object",
|
|
1548
1899
|
required: ["volumeId", "path"],
|
|
1549
1900
|
additionalProperties: false,
|
|
1550
|
-
description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods.
|
|
1901
|
+
description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods. On a pod, the volume can be mounted, moved, or unmounted after creation (see `UpdatePodMounts`).",
|
|
1551
1902
|
properties: {
|
|
1552
1903
|
volumeId: {
|
|
1553
1904
|
type: "string",
|
|
@@ -1570,7 +1921,7 @@ var generatedTools = [
|
|
|
1570
1921
|
size: {
|
|
1571
1922
|
type: "integer",
|
|
1572
1923
|
minimum: 10,
|
|
1573
|
-
description: "Host-local persistent storage in GB.
|
|
1924
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
1574
1925
|
examples: [20]
|
|
1575
1926
|
},
|
|
1576
1927
|
path: {
|
|
@@ -1867,7 +2218,7 @@ var generatedTools = [
|
|
|
1867
2218
|
size: {
|
|
1868
2219
|
type: "integer",
|
|
1869
2220
|
minimum: 10,
|
|
1870
|
-
description: "Host-local persistent storage in GB.
|
|
2221
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
1871
2222
|
examples: [20]
|
|
1872
2223
|
},
|
|
1873
2224
|
path: {
|
|
@@ -1928,13 +2279,12 @@ var generatedTools = [
|
|
|
1928
2279
|
}
|
|
1929
2280
|
},
|
|
1930
2281
|
{
|
|
1931
|
-
name: "delete-
|
|
1932
|
-
title: "Delete
|
|
1933
|
-
operationId: "
|
|
1934
|
-
description: "Delete a
|
|
1935
|
-
directoryDescription: "Delete a Serverless endpoint permanently and immediately.",
|
|
2282
|
+
name: "delete-cost-center",
|
|
2283
|
+
title: "Delete cost center",
|
|
2284
|
+
operationId: "deleteCostCenter",
|
|
2285
|
+
description: "Delete a cost center. Deletes a cost center. The delete fails with 409 while any resource is still attributed to the cost center; detach those resources first.",
|
|
1936
2286
|
method: "DELETE",
|
|
1937
|
-
path: "/v2/
|
|
2287
|
+
path: "/v2/cost-centers/{id}",
|
|
1938
2288
|
params: [
|
|
1939
2289
|
{
|
|
1940
2290
|
name: "id",
|
|
@@ -1953,17 +2303,50 @@ var generatedTools = [
|
|
|
1953
2303
|
properties: {
|
|
1954
2304
|
id: {
|
|
1955
2305
|
type: "string",
|
|
1956
|
-
|
|
2306
|
+
minLength: 1,
|
|
2307
|
+
description: "Cost center identifier."
|
|
1957
2308
|
}
|
|
1958
2309
|
},
|
|
1959
2310
|
required: ["id"]
|
|
1960
2311
|
}
|
|
1961
2312
|
},
|
|
1962
2313
|
{
|
|
1963
|
-
name: "delete-
|
|
1964
|
-
title: "Delete
|
|
1965
|
-
operationId: "
|
|
1966
|
-
description: "Delete a
|
|
2314
|
+
name: "delete-endpoint",
|
|
2315
|
+
title: "Delete endpoint",
|
|
2316
|
+
operationId: "deleteEndpoint",
|
|
2317
|
+
description: "Delete a serverless endpoint permanently and immediately. Verify the id belongs to the intended endpoint (get-endpoint) before deleting; delete only endpoints your own tool calls created in this conversation, or the one the user asked you to delete by id \u2014 a name found by listing is not attribution.",
|
|
2318
|
+
directoryDescription: "Delete a Serverless endpoint permanently and immediately.",
|
|
2319
|
+
method: "DELETE",
|
|
2320
|
+
path: "/v2/serverless/{id}",
|
|
2321
|
+
params: [
|
|
2322
|
+
{
|
|
2323
|
+
name: "id",
|
|
2324
|
+
location: "path"
|
|
2325
|
+
}
|
|
2326
|
+
],
|
|
2327
|
+
hasBody: false,
|
|
2328
|
+
annotations: {
|
|
2329
|
+
readOnlyHint: false,
|
|
2330
|
+
destructiveHint: true,
|
|
2331
|
+
idempotentHint: true,
|
|
2332
|
+
openWorldHint: true
|
|
2333
|
+
},
|
|
2334
|
+
inputSchema: {
|
|
2335
|
+
type: "object",
|
|
2336
|
+
properties: {
|
|
2337
|
+
id: {
|
|
2338
|
+
type: "string",
|
|
2339
|
+
description: "Serverless endpoint identifier"
|
|
2340
|
+
}
|
|
2341
|
+
},
|
|
2342
|
+
required: ["id"]
|
|
2343
|
+
}
|
|
2344
|
+
},
|
|
2345
|
+
{
|
|
2346
|
+
name: "delete-global-volume",
|
|
2347
|
+
title: "Delete global volume",
|
|
2348
|
+
operationId: "deleteGlobalVolume",
|
|
2349
|
+
description: "Delete a global volume. Permanently deletes a global volume and its stored data. Fails with `409` while the volume is still mounted: terminate every pod that mounts it (stopped pods count) and detach it from every serverless endpoint first. Nothing is detached or terminated on your behalf.",
|
|
1967
2350
|
method: "DELETE",
|
|
1968
2351
|
path: "/v2/global-volumes/{id}",
|
|
1969
2352
|
params: [
|
|
@@ -2021,6 +2404,131 @@ var generatedTools = [
|
|
|
2021
2404
|
required: ["id"]
|
|
2022
2405
|
}
|
|
2023
2406
|
},
|
|
2407
|
+
{
|
|
2408
|
+
name: "delete-organization-group",
|
|
2409
|
+
title: "Delete organization group",
|
|
2410
|
+
operationId: "deleteOrganizationGroup",
|
|
2411
|
+
description: "Delete a group in your current organization. Permanently deletes the group and its group memberships. Organization members are not removed. Returns 404 when the group does not exist in your current organization, including when it has already been deleted.",
|
|
2412
|
+
method: "DELETE",
|
|
2413
|
+
path: "/v2/organization/groups/{id}",
|
|
2414
|
+
params: [
|
|
2415
|
+
{
|
|
2416
|
+
name: "id",
|
|
2417
|
+
location: "path"
|
|
2418
|
+
}
|
|
2419
|
+
],
|
|
2420
|
+
hasBody: false,
|
|
2421
|
+
annotations: {
|
|
2422
|
+
readOnlyHint: false,
|
|
2423
|
+
destructiveHint: true,
|
|
2424
|
+
idempotentHint: true,
|
|
2425
|
+
openWorldHint: true
|
|
2426
|
+
},
|
|
2427
|
+
inputSchema: {
|
|
2428
|
+
type: "object",
|
|
2429
|
+
properties: {
|
|
2430
|
+
id: {
|
|
2431
|
+
type: "string",
|
|
2432
|
+
minLength: 1,
|
|
2433
|
+
description: "Group ID."
|
|
2434
|
+
}
|
|
2435
|
+
},
|
|
2436
|
+
required: ["id"]
|
|
2437
|
+
}
|
|
2438
|
+
},
|
|
2439
|
+
{
|
|
2440
|
+
name: "delete-organization-invite",
|
|
2441
|
+
title: "Delete organization invite",
|
|
2442
|
+
operationId: "deleteOrganizationInvite",
|
|
2443
|
+
description: "Cancel an organization invite. Cancels one invitation to the authenticated caller's organization; the invitee can no longer accept it. Returns 404 when the ID is unknown to the caller's organization: never issued, already accepted, already cancelled, or issued by another organization. An expired invite can still be cancelled. Cancelling invites requires the organization's invite-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
|
|
2444
|
+
method: "DELETE",
|
|
2445
|
+
path: "/v2/organization/invites/{id}",
|
|
2446
|
+
params: [
|
|
2447
|
+
{
|
|
2448
|
+
name: "id",
|
|
2449
|
+
location: "path"
|
|
2450
|
+
}
|
|
2451
|
+
],
|
|
2452
|
+
hasBody: false,
|
|
2453
|
+
annotations: {
|
|
2454
|
+
readOnlyHint: false,
|
|
2455
|
+
destructiveHint: true,
|
|
2456
|
+
idempotentHint: true,
|
|
2457
|
+
openWorldHint: true
|
|
2458
|
+
},
|
|
2459
|
+
inputSchema: {
|
|
2460
|
+
type: "object",
|
|
2461
|
+
properties: {
|
|
2462
|
+
id: {
|
|
2463
|
+
type: "string",
|
|
2464
|
+
description: "Invite identifier"
|
|
2465
|
+
}
|
|
2466
|
+
},
|
|
2467
|
+
required: ["id"]
|
|
2468
|
+
}
|
|
2469
|
+
},
|
|
2470
|
+
{
|
|
2471
|
+
name: "delete-organization-role",
|
|
2472
|
+
title: "Delete organization role",
|
|
2473
|
+
operationId: "deleteOrganizationRole",
|
|
2474
|
+
description: "Delete a custom organization role. Deletes a custom role from the authenticated caller's organization. Returns 409 while a member or a pending invite holds the role: reassign those members and cancel those invites first, since deleting never changes anyone's role. Expired invites do not block deletion. Returns 400 for a built-in role, which cannot be deleted; 404 when the ID is unknown, names another organization's role, or was already deleted. Deleting roles requires the organization's role-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
|
|
2475
|
+
method: "DELETE",
|
|
2476
|
+
path: "/v2/organization/roles/{id}",
|
|
2477
|
+
params: [
|
|
2478
|
+
{
|
|
2479
|
+
name: "id",
|
|
2480
|
+
location: "path"
|
|
2481
|
+
}
|
|
2482
|
+
],
|
|
2483
|
+
hasBody: false,
|
|
2484
|
+
annotations: {
|
|
2485
|
+
readOnlyHint: false,
|
|
2486
|
+
destructiveHint: true,
|
|
2487
|
+
idempotentHint: true,
|
|
2488
|
+
openWorldHint: true
|
|
2489
|
+
},
|
|
2490
|
+
inputSchema: {
|
|
2491
|
+
type: "object",
|
|
2492
|
+
properties: {
|
|
2493
|
+
id: {
|
|
2494
|
+
type: "string",
|
|
2495
|
+
description: "Role identifier"
|
|
2496
|
+
}
|
|
2497
|
+
},
|
|
2498
|
+
required: ["id"]
|
|
2499
|
+
}
|
|
2500
|
+
},
|
|
2501
|
+
{
|
|
2502
|
+
name: "delete-organization-user",
|
|
2503
|
+
title: "Delete organization user",
|
|
2504
|
+
operationId: "deleteOrganizationUser",
|
|
2505
|
+
description: "Remove an organization member. Removes one member from the authenticated caller's organization by user ID. Their group memberships end and the API keys attributed to them within the organization are revoked; the resources they created stay with the organization. Removing another member requires the organization's member-removal capability, which the built-in admin role holds; any member can remove themselves. The organization keeps at least one member with the built-in admin role, so removing the last one returns 409. A user who is not a member, including one from another organization, returns 404. A member without the capability removing someone else, a caller outside an organization, and a caller for whom organizations are unavailable receive 403.",
|
|
2506
|
+
method: "DELETE",
|
|
2507
|
+
path: "/v2/organization/users/{id}",
|
|
2508
|
+
params: [
|
|
2509
|
+
{
|
|
2510
|
+
name: "id",
|
|
2511
|
+
location: "path"
|
|
2512
|
+
}
|
|
2513
|
+
],
|
|
2514
|
+
hasBody: false,
|
|
2515
|
+
annotations: {
|
|
2516
|
+
readOnlyHint: false,
|
|
2517
|
+
destructiveHint: true,
|
|
2518
|
+
idempotentHint: true,
|
|
2519
|
+
openWorldHint: true
|
|
2520
|
+
},
|
|
2521
|
+
inputSchema: {
|
|
2522
|
+
type: "object",
|
|
2523
|
+
properties: {
|
|
2524
|
+
id: {
|
|
2525
|
+
type: "string",
|
|
2526
|
+
description: "User identifier"
|
|
2527
|
+
}
|
|
2528
|
+
},
|
|
2529
|
+
required: ["id"]
|
|
2530
|
+
}
|
|
2531
|
+
},
|
|
2024
2532
|
{
|
|
2025
2533
|
name: "delete-pod",
|
|
2026
2534
|
title: "Delete Pod",
|
|
@@ -2146,6 +2654,63 @@ var generatedTools = [
|
|
|
2146
2654
|
required: ["id"]
|
|
2147
2655
|
}
|
|
2148
2656
|
},
|
|
2657
|
+
{
|
|
2658
|
+
name: "detach-cost-center-resource",
|
|
2659
|
+
title: "Detach cost center resource",
|
|
2660
|
+
operationId: "detachCostCenterResource",
|
|
2661
|
+
description: "Remove a resource from a cost center. Removes a resource's attribution to a cost center. The resource itself is untouched. Returns 404 when the cost center does not exist or the resource is not attributed to it, so repeating a DELETE that succeeded returns 404.",
|
|
2662
|
+
method: "DELETE",
|
|
2663
|
+
path: "/v2/cost-centers/{id}/{resourceType}/{resourceId}",
|
|
2664
|
+
params: [
|
|
2665
|
+
{
|
|
2666
|
+
name: "id",
|
|
2667
|
+
location: "path"
|
|
2668
|
+
},
|
|
2669
|
+
{
|
|
2670
|
+
name: "resourceType",
|
|
2671
|
+
location: "path"
|
|
2672
|
+
},
|
|
2673
|
+
{
|
|
2674
|
+
name: "resourceId",
|
|
2675
|
+
location: "path"
|
|
2676
|
+
}
|
|
2677
|
+
],
|
|
2678
|
+
hasBody: false,
|
|
2679
|
+
annotations: {
|
|
2680
|
+
readOnlyHint: false,
|
|
2681
|
+
destructiveHint: true,
|
|
2682
|
+
idempotentHint: true,
|
|
2683
|
+
openWorldHint: true
|
|
2684
|
+
},
|
|
2685
|
+
inputSchema: {
|
|
2686
|
+
type: "object",
|
|
2687
|
+
properties: {
|
|
2688
|
+
id: {
|
|
2689
|
+
type: "string",
|
|
2690
|
+
minLength: 1,
|
|
2691
|
+
description: "Cost center identifier."
|
|
2692
|
+
},
|
|
2693
|
+
resourceType: {
|
|
2694
|
+
$ref: "#/$defs/ResourceType",
|
|
2695
|
+
description: "Kind of resource.",
|
|
2696
|
+
type: "string"
|
|
2697
|
+
},
|
|
2698
|
+
resourceId: {
|
|
2699
|
+
type: "string",
|
|
2700
|
+
minLength: 1,
|
|
2701
|
+
description: "Resource identifier."
|
|
2702
|
+
}
|
|
2703
|
+
},
|
|
2704
|
+
required: ["id", "resourceType", "resourceId"],
|
|
2705
|
+
$defs: {
|
|
2706
|
+
ResourceType: {
|
|
2707
|
+
type: "string",
|
|
2708
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
2709
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
2710
|
+
}
|
|
2711
|
+
}
|
|
2712
|
+
}
|
|
2713
|
+
},
|
|
2149
2714
|
{
|
|
2150
2715
|
name: "get-cluster",
|
|
2151
2716
|
title: "Get cluster",
|
|
@@ -2177,6 +2742,38 @@ var generatedTools = [
|
|
|
2177
2742
|
required: ["id"]
|
|
2178
2743
|
}
|
|
2179
2744
|
},
|
|
2745
|
+
{
|
|
2746
|
+
name: "get-cost-center",
|
|
2747
|
+
title: "Get cost center",
|
|
2748
|
+
operationId: "getCostCenter",
|
|
2749
|
+
description: "Get a cost center. Returns one cost center. Its attributed resources are listed by `GET /v2/cost-centers/{id}/resources`. Returns 404 when the cost center does not exist or is not the caller's.",
|
|
2750
|
+
method: "GET",
|
|
2751
|
+
path: "/v2/cost-centers/{id}",
|
|
2752
|
+
params: [
|
|
2753
|
+
{
|
|
2754
|
+
name: "id",
|
|
2755
|
+
location: "path"
|
|
2756
|
+
}
|
|
2757
|
+
],
|
|
2758
|
+
hasBody: false,
|
|
2759
|
+
annotations: {
|
|
2760
|
+
readOnlyHint: true,
|
|
2761
|
+
destructiveHint: false,
|
|
2762
|
+
idempotentHint: true,
|
|
2763
|
+
openWorldHint: true
|
|
2764
|
+
},
|
|
2765
|
+
inputSchema: {
|
|
2766
|
+
type: "object",
|
|
2767
|
+
properties: {
|
|
2768
|
+
id: {
|
|
2769
|
+
type: "string",
|
|
2770
|
+
minLength: 1,
|
|
2771
|
+
description: "Cost center identifier."
|
|
2772
|
+
}
|
|
2773
|
+
},
|
|
2774
|
+
required: ["id"]
|
|
2775
|
+
}
|
|
2776
|
+
},
|
|
2180
2777
|
{
|
|
2181
2778
|
name: "get-cpu-type",
|
|
2182
2779
|
title: "Get CPU type",
|
|
@@ -2374,6 +2971,261 @@ var generatedTools = [
|
|
|
2374
2971
|
required: ["id", "buildId"]
|
|
2375
2972
|
}
|
|
2376
2973
|
},
|
|
2974
|
+
{
|
|
2975
|
+
name: "get-endpoint-cold-start-metrics",
|
|
2976
|
+
title: "Get endpoint cold start metrics",
|
|
2977
|
+
operationId: "getEndpointColdStartMetrics",
|
|
2978
|
+
description: "Get serverless endpoint cold start metrics. Returns the cold start series shown on the endpoint's Metrics tab in the console. **Window.** `startTime` is inclusive and `endTime` is exclusive. Both are optional: `endTime` defaults to now and `startTime` to 24 hours before `endTime`, rounded down to the start of an `interval` bucket. An `endTime` in the future is treated as now. Metrics are kept for 90 days, so `startTime` must be within the last 90 days. **Interval.** Each record covers one `interval`-sized bucket, aligned to UTC. **Paging.** Records are oldest first, at most `limit` (default 1000) per page. Follow `pagination.nextCursor` while `pagination.hasNextPage` is true. The cursor keeps the first page's window, so `startTime`, `endTime`, and `interval` can be left out on later pages; if sent, they must match the first page or the cursor is rejected with 422. **Sparse series.** Buckets with no activity are omitted, not zero-filled, so `records` can be shorter than the number of buckets in the window, or empty. **Units.** `durationMs` is how long each cold start took, in milliseconds.",
|
|
2979
|
+
method: "GET",
|
|
2980
|
+
path: "/v2/serverless/{id}/metrics/cold-starts",
|
|
2981
|
+
params: [
|
|
2982
|
+
{
|
|
2983
|
+
name: "id",
|
|
2984
|
+
location: "path"
|
|
2985
|
+
},
|
|
2986
|
+
{
|
|
2987
|
+
name: "startTime",
|
|
2988
|
+
location: "query"
|
|
2989
|
+
},
|
|
2990
|
+
{
|
|
2991
|
+
name: "endTime",
|
|
2992
|
+
location: "query"
|
|
2993
|
+
},
|
|
2994
|
+
{
|
|
2995
|
+
name: "interval",
|
|
2996
|
+
location: "query"
|
|
2997
|
+
},
|
|
2998
|
+
{
|
|
2999
|
+
name: "cursor",
|
|
3000
|
+
location: "query"
|
|
3001
|
+
},
|
|
3002
|
+
{
|
|
3003
|
+
name: "limit",
|
|
3004
|
+
location: "query"
|
|
3005
|
+
}
|
|
3006
|
+
],
|
|
3007
|
+
hasBody: false,
|
|
3008
|
+
annotations: {
|
|
3009
|
+
readOnlyHint: true,
|
|
3010
|
+
destructiveHint: false,
|
|
3011
|
+
idempotentHint: true,
|
|
3012
|
+
openWorldHint: true
|
|
3013
|
+
},
|
|
3014
|
+
inputSchema: {
|
|
3015
|
+
type: "object",
|
|
3016
|
+
properties: {
|
|
3017
|
+
id: {
|
|
3018
|
+
type: "string",
|
|
3019
|
+
description: "Serverless endpoint identifier"
|
|
3020
|
+
},
|
|
3021
|
+
startTime: {
|
|
3022
|
+
type: "string",
|
|
3023
|
+
format: "date-time",
|
|
3024
|
+
description: "Start of the window (RFC 3339), inclusive. Defaults to 24 hours before endTime, rounded down to the start of an interval bucket. Must be within the last 90 days."
|
|
3025
|
+
},
|
|
3026
|
+
endTime: {
|
|
3027
|
+
type: "string",
|
|
3028
|
+
format: "date-time",
|
|
3029
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
3030
|
+
},
|
|
3031
|
+
interval: {
|
|
3032
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
3033
|
+
description: "Bucket size. Defaults to 1h.",
|
|
3034
|
+
type: "string"
|
|
3035
|
+
},
|
|
3036
|
+
cursor: {
|
|
3037
|
+
type: "string",
|
|
3038
|
+
minLength: 1,
|
|
3039
|
+
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."
|
|
3040
|
+
},
|
|
3041
|
+
limit: {
|
|
3042
|
+
type: "integer",
|
|
3043
|
+
minimum: 1,
|
|
3044
|
+
maximum: 1e3,
|
|
3045
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
3046
|
+
}
|
|
3047
|
+
},
|
|
3048
|
+
required: ["id"],
|
|
3049
|
+
$defs: {
|
|
3050
|
+
EndpointMetricsInterval: {
|
|
3051
|
+
type: "string",
|
|
3052
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
3053
|
+
default: "1h",
|
|
3054
|
+
description: "Bucket size for endpoint metrics."
|
|
3055
|
+
}
|
|
3056
|
+
}
|
|
3057
|
+
}
|
|
3058
|
+
},
|
|
3059
|
+
{
|
|
3060
|
+
name: "get-endpoint-request-metrics",
|
|
3061
|
+
title: "Get endpoint request metrics",
|
|
3062
|
+
operationId: "getEndpointRequestMetrics",
|
|
3063
|
+
description: "Get serverless endpoint request metrics. Returns the request series shown on the endpoint's Metrics tab in the console. **Window.** `startTime` is inclusive and `endTime` is exclusive. Both are optional: `endTime` defaults to now and `startTime` to 24 hours before `endTime`, rounded down to the start of an `interval` bucket. An `endTime` in the future is treated as now. Metrics are kept for 90 days, so `startTime` must be within the last 90 days. **Interval.** Each record covers one `interval`-sized bucket, aligned to UTC. **Paging.** Records are oldest first, at most `limit` (default 1000) per page. Follow `pagination.nextCursor` while `pagination.hasNextPage` is true. The cursor keeps the first page's window, so `startTime`, `endTime`, and `interval` can be left out on later pages; if sent, they must match the first page or the cursor is rejected with 422. **Sparse series.** Buckets with no activity are omitted, not zero-filled, so `records` can be shorter than the number of buckets in the window, or empty. **Units.** Durations are milliseconds. `executionTimeMs` is the time a worker spent running a request; `delayTimeMs` is the time a request waited in the queue before a worker picked it up.",
|
|
3064
|
+
method: "GET",
|
|
3065
|
+
path: "/v2/serverless/{id}/metrics/requests",
|
|
3066
|
+
params: [
|
|
3067
|
+
{
|
|
3068
|
+
name: "id",
|
|
3069
|
+
location: "path"
|
|
3070
|
+
},
|
|
3071
|
+
{
|
|
3072
|
+
name: "startTime",
|
|
3073
|
+
location: "query"
|
|
3074
|
+
},
|
|
3075
|
+
{
|
|
3076
|
+
name: "endTime",
|
|
3077
|
+
location: "query"
|
|
3078
|
+
},
|
|
3079
|
+
{
|
|
3080
|
+
name: "interval",
|
|
3081
|
+
location: "query"
|
|
3082
|
+
},
|
|
3083
|
+
{
|
|
3084
|
+
name: "cursor",
|
|
3085
|
+
location: "query"
|
|
3086
|
+
},
|
|
3087
|
+
{
|
|
3088
|
+
name: "limit",
|
|
3089
|
+
location: "query"
|
|
3090
|
+
}
|
|
3091
|
+
],
|
|
3092
|
+
hasBody: false,
|
|
3093
|
+
annotations: {
|
|
3094
|
+
readOnlyHint: true,
|
|
3095
|
+
destructiveHint: false,
|
|
3096
|
+
idempotentHint: true,
|
|
3097
|
+
openWorldHint: true
|
|
3098
|
+
},
|
|
3099
|
+
inputSchema: {
|
|
3100
|
+
type: "object",
|
|
3101
|
+
properties: {
|
|
3102
|
+
id: {
|
|
3103
|
+
type: "string",
|
|
3104
|
+
description: "Serverless endpoint identifier"
|
|
3105
|
+
},
|
|
3106
|
+
startTime: {
|
|
3107
|
+
type: "string",
|
|
3108
|
+
format: "date-time",
|
|
3109
|
+
description: "Start of the window (RFC 3339), inclusive. Defaults to 24 hours before endTime, rounded down to the start of an interval bucket. Must be within the last 90 days."
|
|
3110
|
+
},
|
|
3111
|
+
endTime: {
|
|
3112
|
+
type: "string",
|
|
3113
|
+
format: "date-time",
|
|
3114
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
3115
|
+
},
|
|
3116
|
+
interval: {
|
|
3117
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
3118
|
+
description: "Bucket size. Defaults to 1h.",
|
|
3119
|
+
type: "string"
|
|
3120
|
+
},
|
|
3121
|
+
cursor: {
|
|
3122
|
+
type: "string",
|
|
3123
|
+
minLength: 1,
|
|
3124
|
+
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."
|
|
3125
|
+
},
|
|
3126
|
+
limit: {
|
|
3127
|
+
type: "integer",
|
|
3128
|
+
minimum: 1,
|
|
3129
|
+
maximum: 1e3,
|
|
3130
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
3131
|
+
}
|
|
3132
|
+
},
|
|
3133
|
+
required: ["id"],
|
|
3134
|
+
$defs: {
|
|
3135
|
+
EndpointMetricsInterval: {
|
|
3136
|
+
type: "string",
|
|
3137
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
3138
|
+
default: "1h",
|
|
3139
|
+
description: "Bucket size for endpoint metrics."
|
|
3140
|
+
}
|
|
3141
|
+
}
|
|
3142
|
+
}
|
|
3143
|
+
},
|
|
3144
|
+
{
|
|
3145
|
+
name: "get-endpoint-worker-metrics",
|
|
3146
|
+
title: "Get endpoint worker metrics",
|
|
3147
|
+
operationId: "getEndpointWorkerMetrics",
|
|
3148
|
+
description: "Get serverless endpoint worker metrics. Returns the worker state series shown on the endpoint's Metrics tab in the console. For the current worker list, use `GET /v2/serverless/{id}/workers`. **Window.** `startTime` is inclusive and `endTime` is exclusive. Both are optional: `endTime` defaults to now and `startTime` to 24 hours before `endTime`, rounded down to the start of an `interval` bucket. An `endTime` in the future is treated as now. Metrics are kept for 90 days, so `startTime` must be within the last 90 days. **Interval.** Each record covers one `interval`-sized bucket, aligned to UTC. **Paging.** Records are oldest first, at most `limit` (default 1000) per page. Follow `pagination.nextCursor` while `pagination.hasNextPage` is true. The cursor keeps the first page's window, so `startTime`, `endTime`, and `interval` can be left out on later pages; if sent, they must match the first page or the cursor is rejected with 422. **Sparse series.** Buckets with no activity are omitted, not zero-filled, so `records` can be shorter than the number of buckets in the window, or empty. **Snapshots.** Each record holds the last worker-count snapshot in its bucket, as point-in-time counts.",
|
|
3149
|
+
method: "GET",
|
|
3150
|
+
path: "/v2/serverless/{id}/metrics/workers",
|
|
3151
|
+
params: [
|
|
3152
|
+
{
|
|
3153
|
+
name: "id",
|
|
3154
|
+
location: "path"
|
|
3155
|
+
},
|
|
3156
|
+
{
|
|
3157
|
+
name: "startTime",
|
|
3158
|
+
location: "query"
|
|
3159
|
+
},
|
|
3160
|
+
{
|
|
3161
|
+
name: "endTime",
|
|
3162
|
+
location: "query"
|
|
3163
|
+
},
|
|
3164
|
+
{
|
|
3165
|
+
name: "interval",
|
|
3166
|
+
location: "query"
|
|
3167
|
+
},
|
|
3168
|
+
{
|
|
3169
|
+
name: "cursor",
|
|
3170
|
+
location: "query"
|
|
3171
|
+
},
|
|
3172
|
+
{
|
|
3173
|
+
name: "limit",
|
|
3174
|
+
location: "query"
|
|
3175
|
+
}
|
|
3176
|
+
],
|
|
3177
|
+
hasBody: false,
|
|
3178
|
+
annotations: {
|
|
3179
|
+
readOnlyHint: true,
|
|
3180
|
+
destructiveHint: false,
|
|
3181
|
+
idempotentHint: true,
|
|
3182
|
+
openWorldHint: true
|
|
3183
|
+
},
|
|
3184
|
+
inputSchema: {
|
|
3185
|
+
type: "object",
|
|
3186
|
+
properties: {
|
|
3187
|
+
id: {
|
|
3188
|
+
type: "string",
|
|
3189
|
+
description: "Serverless endpoint identifier"
|
|
3190
|
+
},
|
|
3191
|
+
startTime: {
|
|
3192
|
+
type: "string",
|
|
3193
|
+
format: "date-time",
|
|
3194
|
+
description: "Start of the window (RFC 3339), inclusive. Defaults to 24 hours before endTime, rounded down to the start of an interval bucket. Must be within the last 90 days."
|
|
3195
|
+
},
|
|
3196
|
+
endTime: {
|
|
3197
|
+
type: "string",
|
|
3198
|
+
format: "date-time",
|
|
3199
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
3200
|
+
},
|
|
3201
|
+
interval: {
|
|
3202
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
3203
|
+
description: "Bucket size. Defaults to 1h.",
|
|
3204
|
+
type: "string"
|
|
3205
|
+
},
|
|
3206
|
+
cursor: {
|
|
3207
|
+
type: "string",
|
|
3208
|
+
minLength: 1,
|
|
3209
|
+
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."
|
|
3210
|
+
},
|
|
3211
|
+
limit: {
|
|
3212
|
+
type: "integer",
|
|
3213
|
+
minimum: 1,
|
|
3214
|
+
maximum: 1e3,
|
|
3215
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
3216
|
+
}
|
|
3217
|
+
},
|
|
3218
|
+
required: ["id"],
|
|
3219
|
+
$defs: {
|
|
3220
|
+
EndpointMetricsInterval: {
|
|
3221
|
+
type: "string",
|
|
3222
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
3223
|
+
default: "1h",
|
|
3224
|
+
description: "Bucket size for endpoint metrics."
|
|
3225
|
+
}
|
|
3226
|
+
}
|
|
3227
|
+
}
|
|
3228
|
+
},
|
|
2377
3229
|
{
|
|
2378
3230
|
name: "get-global-volume",
|
|
2379
3231
|
title: "Get global volume",
|
|
@@ -2486,7 +3338,7 @@ var generatedTools = [
|
|
|
2486
3338
|
},
|
|
2487
3339
|
cloud: {
|
|
2488
3340
|
$ref: "#/$defs/GpuCloudFilter",
|
|
2489
|
-
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY.
|
|
3341
|
+
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Default when omitted: SECURE.",
|
|
2490
3342
|
type: "string"
|
|
2491
3343
|
},
|
|
2492
3344
|
countryCodes: {
|
|
@@ -2525,19 +3377,133 @@ var generatedTools = [
|
|
|
2525
3377
|
},
|
|
2526
3378
|
Product: {
|
|
2527
3379
|
type: "string",
|
|
2528
|
-
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
2529
|
-
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
3380
|
+
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
3381
|
+
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
3382
|
+
}
|
|
3383
|
+
}
|
|
3384
|
+
}
|
|
3385
|
+
},
|
|
3386
|
+
{
|
|
3387
|
+
name: "get-network-volume",
|
|
3388
|
+
title: "Get network volume",
|
|
3389
|
+
operationId: "getNetworkVolume",
|
|
3390
|
+
description: "Get a network volume. Returns a single network volume by ID.",
|
|
3391
|
+
method: "GET",
|
|
3392
|
+
path: "/v2/network-volumes/{id}",
|
|
3393
|
+
params: [
|
|
3394
|
+
{
|
|
3395
|
+
name: "id",
|
|
3396
|
+
location: "path"
|
|
3397
|
+
}
|
|
3398
|
+
],
|
|
3399
|
+
hasBody: false,
|
|
3400
|
+
annotations: {
|
|
3401
|
+
readOnlyHint: true,
|
|
3402
|
+
destructiveHint: false,
|
|
3403
|
+
idempotentHint: true,
|
|
3404
|
+
openWorldHint: true
|
|
3405
|
+
},
|
|
3406
|
+
inputSchema: {
|
|
3407
|
+
type: "object",
|
|
3408
|
+
properties: {
|
|
3409
|
+
id: {
|
|
3410
|
+
type: "string",
|
|
3411
|
+
description: "Network volume identifier"
|
|
3412
|
+
}
|
|
3413
|
+
},
|
|
3414
|
+
required: ["id"]
|
|
3415
|
+
}
|
|
3416
|
+
},
|
|
3417
|
+
{
|
|
3418
|
+
name: "get-organization",
|
|
3419
|
+
title: "Get organization",
|
|
3420
|
+
operationId: "getOrganization",
|
|
3421
|
+
description: "Get your current organization. Returns the authenticated caller's current organization. Organization context comes from the caller's membership; no organization selector is required. Returns 404 when the caller does not belong to an organization, or 403 when organizations are unavailable to the caller.",
|
|
3422
|
+
method: "GET",
|
|
3423
|
+
path: "/v2/organization",
|
|
3424
|
+
params: [],
|
|
3425
|
+
hasBody: false,
|
|
3426
|
+
annotations: {
|
|
3427
|
+
readOnlyHint: true,
|
|
3428
|
+
destructiveHint: false,
|
|
3429
|
+
idempotentHint: true,
|
|
3430
|
+
openWorldHint: true
|
|
3431
|
+
},
|
|
3432
|
+
inputSchema: {
|
|
3433
|
+
type: "object",
|
|
3434
|
+
properties: {}
|
|
3435
|
+
}
|
|
3436
|
+
},
|
|
3437
|
+
{
|
|
3438
|
+
name: "get-organization-group",
|
|
3439
|
+
title: "Get organization group",
|
|
3440
|
+
operationId: "getOrganizationGroup",
|
|
3441
|
+
description: "Get a group in your current organization. Returns the group without its members. Returns 404 when the ID is unknown or belongs to another organization, or when the caller does not belong to an organization.",
|
|
3442
|
+
method: "GET",
|
|
3443
|
+
path: "/v2/organization/groups/{id}",
|
|
3444
|
+
params: [
|
|
3445
|
+
{
|
|
3446
|
+
name: "id",
|
|
3447
|
+
location: "path"
|
|
3448
|
+
}
|
|
3449
|
+
],
|
|
3450
|
+
hasBody: false,
|
|
3451
|
+
annotations: {
|
|
3452
|
+
readOnlyHint: true,
|
|
3453
|
+
destructiveHint: false,
|
|
3454
|
+
idempotentHint: true,
|
|
3455
|
+
openWorldHint: true
|
|
3456
|
+
},
|
|
3457
|
+
inputSchema: {
|
|
3458
|
+
type: "object",
|
|
3459
|
+
properties: {
|
|
3460
|
+
id: {
|
|
3461
|
+
type: "string",
|
|
3462
|
+
minLength: 1,
|
|
3463
|
+
description: "Group ID."
|
|
3464
|
+
}
|
|
3465
|
+
},
|
|
3466
|
+
required: ["id"]
|
|
3467
|
+
}
|
|
3468
|
+
},
|
|
3469
|
+
{
|
|
3470
|
+
name: "get-organization-invite",
|
|
3471
|
+
title: "Get organization invite",
|
|
3472
|
+
operationId: "getOrganizationInvite",
|
|
3473
|
+
description: "Get a pending organization invite. Returns one pending invitation to the authenticated caller's organization. Only unexpired invites are pending: an invite that has expired, been accepted or been revoked returns 404, as does an ID from another organization. Reading invites requires the organization's invite-management capability, which the built-in admin role holds; other members receive 403. Returns 404 when the caller does not belong to an organization, or 403 when organizations are unavailable to the caller.",
|
|
3474
|
+
method: "GET",
|
|
3475
|
+
path: "/v2/organization/invites/{id}",
|
|
3476
|
+
params: [
|
|
3477
|
+
{
|
|
3478
|
+
name: "id",
|
|
3479
|
+
location: "path"
|
|
3480
|
+
}
|
|
3481
|
+
],
|
|
3482
|
+
hasBody: false,
|
|
3483
|
+
annotations: {
|
|
3484
|
+
readOnlyHint: true,
|
|
3485
|
+
destructiveHint: false,
|
|
3486
|
+
idempotentHint: true,
|
|
3487
|
+
openWorldHint: true
|
|
3488
|
+
},
|
|
3489
|
+
inputSchema: {
|
|
3490
|
+
type: "object",
|
|
3491
|
+
properties: {
|
|
3492
|
+
id: {
|
|
3493
|
+
type: "string",
|
|
3494
|
+
description: "Invite identifier"
|
|
2530
3495
|
}
|
|
2531
|
-
}
|
|
3496
|
+
},
|
|
3497
|
+
required: ["id"]
|
|
2532
3498
|
}
|
|
2533
3499
|
},
|
|
2534
3500
|
{
|
|
2535
|
-
name: "get-
|
|
2536
|
-
title: "Get
|
|
2537
|
-
operationId: "
|
|
2538
|
-
description: "Get
|
|
3501
|
+
name: "get-organization-role",
|
|
3502
|
+
title: "Get organization role",
|
|
3503
|
+
operationId: "getOrganizationRole",
|
|
3504
|
+
description: "Get an organization role. Returns one role a member or invite of the authenticated caller's organization can hold: a built-in role, or one of the organization's custom roles. Returns 404 when the ID is unknown or names another organization's custom role, or when the caller does not belong to an organization; 403 when the caller may not view the organization's roles or organizations are unavailable to the caller.",
|
|
2539
3505
|
method: "GET",
|
|
2540
|
-
path: "/v2/
|
|
3506
|
+
path: "/v2/organization/roles/{id}",
|
|
2541
3507
|
params: [
|
|
2542
3508
|
{
|
|
2543
3509
|
name: "id",
|
|
@@ -2556,20 +3522,31 @@ var generatedTools = [
|
|
|
2556
3522
|
properties: {
|
|
2557
3523
|
id: {
|
|
2558
3524
|
type: "string",
|
|
2559
|
-
description: "
|
|
3525
|
+
description: "Role identifier"
|
|
2560
3526
|
}
|
|
2561
3527
|
},
|
|
2562
3528
|
required: ["id"]
|
|
2563
3529
|
}
|
|
2564
3530
|
},
|
|
2565
3531
|
{
|
|
2566
|
-
name: "get-organization",
|
|
2567
|
-
title: "Get organization",
|
|
2568
|
-
operationId: "
|
|
2569
|
-
description: "
|
|
3532
|
+
name: "get-organization-role-capabilities",
|
|
3533
|
+
title: "Get organization role capabilities",
|
|
3534
|
+
operationId: "getOrganizationRoleCapabilities",
|
|
3535
|
+
description: "List grantable role capabilities. Returns the capabilities a custom role can grant, grouped by family: each capability is a family and one of its verbs, written `FAMILY:VERB`. This is the set role creation accepts, not filtered to the caller's own access; saving a role also requires the caller to hold every capability it grants. `family` and `verb` narrow the result and apply together; with neither, the whole catalog is returned. Reading the catalog requires organization membership; other callers receive 403.",
|
|
2570
3536
|
method: "GET",
|
|
2571
|
-
path: "/v2/organization",
|
|
2572
|
-
params: [
|
|
3537
|
+
path: "/v2/organization/roles/capabilities",
|
|
3538
|
+
params: [
|
|
3539
|
+
{
|
|
3540
|
+
name: "family",
|
|
3541
|
+
location: "query",
|
|
3542
|
+
explode: false
|
|
3543
|
+
},
|
|
3544
|
+
{
|
|
3545
|
+
name: "verb",
|
|
3546
|
+
location: "query",
|
|
3547
|
+
explode: false
|
|
3548
|
+
}
|
|
3549
|
+
],
|
|
2573
3550
|
hasBody: false,
|
|
2574
3551
|
annotations: {
|
|
2575
3552
|
readOnlyHint: true,
|
|
@@ -2579,7 +3556,22 @@ var generatedTools = [
|
|
|
2579
3556
|
},
|
|
2580
3557
|
inputSchema: {
|
|
2581
3558
|
type: "object",
|
|
2582
|
-
properties: {
|
|
3559
|
+
properties: {
|
|
3560
|
+
family: {
|
|
3561
|
+
type: "array",
|
|
3562
|
+
items: {
|
|
3563
|
+
type: "string"
|
|
3564
|
+
},
|
|
3565
|
+
description: "Only return these capability families, matched exactly. Comma-separated; a family matching any listed value is returned. An empty value is ignored."
|
|
3566
|
+
},
|
|
3567
|
+
verb: {
|
|
3568
|
+
type: "array",
|
|
3569
|
+
items: {
|
|
3570
|
+
type: "string"
|
|
3571
|
+
},
|
|
3572
|
+
description: "Only return these verbs, matched exactly. Comma-separated. Each family lists only the requested verbs it has, and a family with none of them is left out. An empty value is ignored."
|
|
3573
|
+
}
|
|
3574
|
+
}
|
|
2583
3575
|
}
|
|
2584
3576
|
},
|
|
2585
3577
|
{
|
|
@@ -3062,6 +4054,107 @@ var generatedTools = [
|
|
|
3062
4054
|
}
|
|
3063
4055
|
}
|
|
3064
4056
|
},
|
|
4057
|
+
{
|
|
4058
|
+
name: "list-cost-center-resources",
|
|
4059
|
+
title: "List cost center resources",
|
|
4060
|
+
operationId: "listCostCenterResources",
|
|
4061
|
+
description: "List a cost center's resources. Returns the resources attributed to one cost center, cursor-paginated; an omitted `limit` defaults to 1000. Each entry is the `{type}/{id}` pair `DELETE /v2/cost-centers/{id}/{resourceType}/{resourceId}` takes. A cost center with nothing attributed returns an empty list; one that does not exist or is not the caller's returns 404.",
|
|
4062
|
+
method: "GET",
|
|
4063
|
+
path: "/v2/cost-centers/{id}/resources",
|
|
4064
|
+
params: [
|
|
4065
|
+
{
|
|
4066
|
+
name: "id",
|
|
4067
|
+
location: "path"
|
|
4068
|
+
},
|
|
4069
|
+
{
|
|
4070
|
+
name: "cursor",
|
|
4071
|
+
location: "query"
|
|
4072
|
+
},
|
|
4073
|
+
{
|
|
4074
|
+
name: "limit",
|
|
4075
|
+
location: "query"
|
|
4076
|
+
}
|
|
4077
|
+
],
|
|
4078
|
+
hasBody: false,
|
|
4079
|
+
annotations: {
|
|
4080
|
+
readOnlyHint: true,
|
|
4081
|
+
destructiveHint: false,
|
|
4082
|
+
idempotentHint: true,
|
|
4083
|
+
openWorldHint: true
|
|
4084
|
+
},
|
|
4085
|
+
inputSchema: {
|
|
4086
|
+
type: "object",
|
|
4087
|
+
properties: {
|
|
4088
|
+
id: {
|
|
4089
|
+
type: "string",
|
|
4090
|
+
minLength: 1,
|
|
4091
|
+
description: "Cost center identifier."
|
|
4092
|
+
},
|
|
4093
|
+
cursor: {
|
|
4094
|
+
type: "string",
|
|
4095
|
+
minLength: 1,
|
|
4096
|
+
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."
|
|
4097
|
+
},
|
|
4098
|
+
limit: {
|
|
4099
|
+
type: "integer",
|
|
4100
|
+
minimum: 1,
|
|
4101
|
+
maximum: 1e3,
|
|
4102
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
4103
|
+
}
|
|
4104
|
+
},
|
|
4105
|
+
required: ["id"]
|
|
4106
|
+
}
|
|
4107
|
+
},
|
|
4108
|
+
{
|
|
4109
|
+
name: "list-cost-centers",
|
|
4110
|
+
title: "List cost centers",
|
|
4111
|
+
operationId: "listCostCenters",
|
|
4112
|
+
description: "List cost centers. Returns the caller's cost centers, cursor-paginated newest-first; an omitted `limit` defaults to 1000. Follow `pagination.nextCursor` until `hasNextPage` is false.",
|
|
4113
|
+
method: "GET",
|
|
4114
|
+
path: "/v2/cost-centers",
|
|
4115
|
+
params: [
|
|
4116
|
+
{
|
|
4117
|
+
name: "search",
|
|
4118
|
+
location: "query"
|
|
4119
|
+
},
|
|
4120
|
+
{
|
|
4121
|
+
name: "cursor",
|
|
4122
|
+
location: "query"
|
|
4123
|
+
},
|
|
4124
|
+
{
|
|
4125
|
+
name: "limit",
|
|
4126
|
+
location: "query"
|
|
4127
|
+
}
|
|
4128
|
+
],
|
|
4129
|
+
hasBody: false,
|
|
4130
|
+
annotations: {
|
|
4131
|
+
readOnlyHint: true,
|
|
4132
|
+
destructiveHint: false,
|
|
4133
|
+
idempotentHint: true,
|
|
4134
|
+
openWorldHint: true
|
|
4135
|
+
},
|
|
4136
|
+
inputSchema: {
|
|
4137
|
+
type: "object",
|
|
4138
|
+
properties: {
|
|
4139
|
+
search: {
|
|
4140
|
+
type: "string",
|
|
4141
|
+
minLength: 1,
|
|
4142
|
+
description: "Case-insensitive substring match against `value`."
|
|
4143
|
+
},
|
|
4144
|
+
cursor: {
|
|
4145
|
+
type: "string",
|
|
4146
|
+
minLength: 1,
|
|
4147
|
+
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."
|
|
4148
|
+
},
|
|
4149
|
+
limit: {
|
|
4150
|
+
type: "integer",
|
|
4151
|
+
minimum: 1,
|
|
4152
|
+
maximum: 1e3,
|
|
4153
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
4154
|
+
}
|
|
4155
|
+
}
|
|
4156
|
+
}
|
|
4157
|
+
},
|
|
3065
4158
|
{
|
|
3066
4159
|
name: "list-cpu-types",
|
|
3067
4160
|
title: "List CPU types",
|
|
@@ -3592,7 +4685,7 @@ var generatedTools = [
|
|
|
3592
4685
|
},
|
|
3593
4686
|
cloud: {
|
|
3594
4687
|
$ref: "#/$defs/GpuCloudFilter",
|
|
3595
|
-
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY.
|
|
4688
|
+
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Default when omitted: SECURE.",
|
|
3596
4689
|
type: "string"
|
|
3597
4690
|
},
|
|
3598
4691
|
countryCodes: {
|
|
@@ -3625,43 +4718,151 @@ var generatedTools = [
|
|
|
3625
4718
|
},
|
|
3626
4719
|
GpuCloudFilter: {
|
|
3627
4720
|
type: "string",
|
|
3628
|
-
description: "GPU availability cloud filter.",
|
|
3629
|
-
enum: ["SECURE", "COMMUNITY"]
|
|
4721
|
+
description: "GPU availability cloud filter.",
|
|
4722
|
+
enum: ["SECURE", "COMMUNITY"]
|
|
4723
|
+
},
|
|
4724
|
+
Product: {
|
|
4725
|
+
type: "string",
|
|
4726
|
+
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
4727
|
+
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
4728
|
+
}
|
|
4729
|
+
}
|
|
4730
|
+
}
|
|
4731
|
+
},
|
|
4732
|
+
{
|
|
4733
|
+
name: "list-network-volume-billing",
|
|
4734
|
+
title: "List network volume billing",
|
|
4735
|
+
operationId: "listNetworkVolumeBilling",
|
|
4736
|
+
description: "Get network volume billing history. Returns network volume billing history for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Use networkVolumeId to filter to one volume; without it, records are emitted per volume per bucket. Each record includes standard storage, high-performance storage, and total amounts, while metadata reports the resolved query, distinct volume count, and totals across the returned records.",
|
|
4737
|
+
method: "GET",
|
|
4738
|
+
path: "/v2/billing/network-volumes",
|
|
4739
|
+
params: [
|
|
4740
|
+
{
|
|
4741
|
+
name: "startTime",
|
|
4742
|
+
location: "query"
|
|
4743
|
+
},
|
|
4744
|
+
{
|
|
4745
|
+
name: "endTime",
|
|
4746
|
+
location: "query"
|
|
4747
|
+
},
|
|
4748
|
+
{
|
|
4749
|
+
name: "bucketSize",
|
|
4750
|
+
location: "query"
|
|
4751
|
+
},
|
|
4752
|
+
{
|
|
4753
|
+
name: "lastN",
|
|
4754
|
+
location: "query"
|
|
4755
|
+
},
|
|
4756
|
+
{
|
|
4757
|
+
name: "networkVolumeId",
|
|
4758
|
+
location: "query"
|
|
4759
|
+
}
|
|
4760
|
+
],
|
|
4761
|
+
hasBody: false,
|
|
4762
|
+
annotations: {
|
|
4763
|
+
readOnlyHint: true,
|
|
4764
|
+
destructiveHint: false,
|
|
4765
|
+
idempotentHint: true,
|
|
4766
|
+
openWorldHint: true
|
|
4767
|
+
},
|
|
4768
|
+
inputSchema: {
|
|
4769
|
+
type: "object",
|
|
4770
|
+
properties: {
|
|
4771
|
+
startTime: {
|
|
4772
|
+
type: "string",
|
|
4773
|
+
format: "date-time",
|
|
4774
|
+
description: "Start of the billing period (RFC 3339). Defaults to 30 days ago."
|
|
4775
|
+
},
|
|
4776
|
+
endTime: {
|
|
4777
|
+
type: "string",
|
|
4778
|
+
format: "date-time",
|
|
4779
|
+
description: "End of the billing period (RFC 3339), exclusive. Defaults to now. Snapped up to the end of the bucketSize bucket it lands in (unless already on a boundary) so the window aligns with the returned records."
|
|
4780
|
+
},
|
|
4781
|
+
bucketSize: {
|
|
4782
|
+
$ref: "#/$defs/BillingBucketSize",
|
|
4783
|
+
description: "Length of each billing time bucket. Defaults to day.",
|
|
4784
|
+
type: "string"
|
|
4785
|
+
},
|
|
4786
|
+
lastN: {
|
|
4787
|
+
type: "integer",
|
|
4788
|
+
minimum: 1,
|
|
4789
|
+
description: 'Return the last N buckets of bucketSize, ending with the current (in-progress) bucket \u2014 e.g. lastN=100 with bucketSize=day is "last 100 days".'
|
|
4790
|
+
},
|
|
4791
|
+
networkVolumeId: {
|
|
4792
|
+
type: "string",
|
|
4793
|
+
description: "Filter to a specific network volume."
|
|
4794
|
+
}
|
|
4795
|
+
},
|
|
4796
|
+
$defs: {
|
|
4797
|
+
BillingBucketSize: {
|
|
4798
|
+
type: "string",
|
|
4799
|
+
enum: ["hour", "day", "week", "month", "year"],
|
|
4800
|
+
default: "day",
|
|
4801
|
+
description: "Length of each billing time bucket.",
|
|
4802
|
+
examples: ["day"]
|
|
4803
|
+
}
|
|
4804
|
+
}
|
|
4805
|
+
}
|
|
4806
|
+
},
|
|
4807
|
+
{
|
|
4808
|
+
name: "list-network-volumes",
|
|
4809
|
+
title: "List network volumes",
|
|
4810
|
+
operationId: "listNetworkVolumes",
|
|
4811
|
+
description: "List network volumes. Returns network volumes owned by the authenticated user, cursor-paginated newest-first; an omitted `limit` defaults to 1000. Follow `pagination.nextCursor` until `hasNextPage` is false.",
|
|
4812
|
+
method: "GET",
|
|
4813
|
+
path: "/v2/network-volumes",
|
|
4814
|
+
params: [
|
|
4815
|
+
{
|
|
4816
|
+
name: "cursor",
|
|
4817
|
+
location: "query"
|
|
4818
|
+
},
|
|
4819
|
+
{
|
|
4820
|
+
name: "limit",
|
|
4821
|
+
location: "query"
|
|
4822
|
+
}
|
|
4823
|
+
],
|
|
4824
|
+
hasBody: false,
|
|
4825
|
+
annotations: {
|
|
4826
|
+
readOnlyHint: true,
|
|
4827
|
+
destructiveHint: false,
|
|
4828
|
+
idempotentHint: true,
|
|
4829
|
+
openWorldHint: true
|
|
4830
|
+
},
|
|
4831
|
+
inputSchema: {
|
|
4832
|
+
type: "object",
|
|
4833
|
+
properties: {
|
|
4834
|
+
cursor: {
|
|
4835
|
+
type: "string",
|
|
4836
|
+
minLength: 1,
|
|
4837
|
+
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."
|
|
3630
4838
|
},
|
|
3631
|
-
|
|
3632
|
-
type: "
|
|
3633
|
-
|
|
3634
|
-
|
|
4839
|
+
limit: {
|
|
4840
|
+
type: "integer",
|
|
4841
|
+
minimum: 1,
|
|
4842
|
+
maximum: 1e3,
|
|
4843
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
3635
4844
|
}
|
|
3636
4845
|
}
|
|
3637
4846
|
}
|
|
3638
4847
|
},
|
|
3639
4848
|
{
|
|
3640
|
-
name: "list-
|
|
3641
|
-
title: "List
|
|
3642
|
-
operationId: "
|
|
3643
|
-
description: "
|
|
4849
|
+
name: "list-organization-group-members",
|
|
4850
|
+
title: "List organization group members",
|
|
4851
|
+
operationId: "listOrganizationGroupMembers",
|
|
4852
|
+
description: "List members of a group. Members are ordered newest first by membership creation time, with a unique upstream tie-breaker. Returns 404 when the group does not exist in the current organization, or when the caller does not belong to an organization.",
|
|
3644
4853
|
method: "GET",
|
|
3645
|
-
path: "/v2/
|
|
4854
|
+
path: "/v2/organization/groups/{id}/members",
|
|
3646
4855
|
params: [
|
|
3647
4856
|
{
|
|
3648
|
-
name: "
|
|
3649
|
-
location: "
|
|
3650
|
-
},
|
|
3651
|
-
{
|
|
3652
|
-
name: "endTime",
|
|
3653
|
-
location: "query"
|
|
3654
|
-
},
|
|
3655
|
-
{
|
|
3656
|
-
name: "bucketSize",
|
|
3657
|
-
location: "query"
|
|
4857
|
+
name: "id",
|
|
4858
|
+
location: "path"
|
|
3658
4859
|
},
|
|
3659
4860
|
{
|
|
3660
|
-
name: "
|
|
4861
|
+
name: "cursor",
|
|
3661
4862
|
location: "query"
|
|
3662
4863
|
},
|
|
3663
4864
|
{
|
|
3664
|
-
name: "
|
|
4865
|
+
name: "limit",
|
|
3665
4866
|
location: "query"
|
|
3666
4867
|
}
|
|
3667
4868
|
],
|
|
@@ -3675,50 +4876,38 @@ var generatedTools = [
|
|
|
3675
4876
|
inputSchema: {
|
|
3676
4877
|
type: "object",
|
|
3677
4878
|
properties: {
|
|
3678
|
-
|
|
4879
|
+
id: {
|
|
3679
4880
|
type: "string",
|
|
3680
|
-
|
|
3681
|
-
description: "
|
|
4881
|
+
minLength: 1,
|
|
4882
|
+
description: "Group ID."
|
|
3682
4883
|
},
|
|
3683
|
-
|
|
4884
|
+
cursor: {
|
|
3684
4885
|
type: "string",
|
|
3685
|
-
|
|
3686
|
-
description: "
|
|
3687
|
-
},
|
|
3688
|
-
bucketSize: {
|
|
3689
|
-
$ref: "#/$defs/BillingBucketSize",
|
|
3690
|
-
description: "Length of each billing time bucket. Defaults to day.",
|
|
3691
|
-
type: "string"
|
|
4886
|
+
minLength: 1,
|
|
4887
|
+
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."
|
|
3692
4888
|
},
|
|
3693
|
-
|
|
4889
|
+
limit: {
|
|
3694
4890
|
type: "integer",
|
|
3695
4891
|
minimum: 1,
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
networkVolumeId: {
|
|
3699
|
-
type: "string",
|
|
3700
|
-
description: "Filter to a specific network volume."
|
|
4892
|
+
maximum: 100,
|
|
4893
|
+
description: "Page size, 1\u2013100. Defaults to 100 when omitted."
|
|
3701
4894
|
}
|
|
3702
4895
|
},
|
|
3703
|
-
|
|
3704
|
-
BillingBucketSize: {
|
|
3705
|
-
type: "string",
|
|
3706
|
-
enum: ["hour", "day", "week", "month", "year"],
|
|
3707
|
-
default: "day",
|
|
3708
|
-
description: "Length of each billing time bucket.",
|
|
3709
|
-
examples: ["day"]
|
|
3710
|
-
}
|
|
3711
|
-
}
|
|
4896
|
+
required: ["id"]
|
|
3712
4897
|
}
|
|
3713
4898
|
},
|
|
3714
4899
|
{
|
|
3715
|
-
name: "list-
|
|
3716
|
-
title: "List
|
|
3717
|
-
operationId: "
|
|
3718
|
-
description: "List
|
|
4900
|
+
name: "list-organization-groups",
|
|
4901
|
+
title: "List organization groups",
|
|
4902
|
+
operationId: "listOrganizationGroups",
|
|
4903
|
+
description: "List groups in your current organization. Returns groups without their members or roles, ordered by creation time descending and then ID descending for deterministic pagination.",
|
|
3719
4904
|
method: "GET",
|
|
3720
|
-
path: "/v2/
|
|
4905
|
+
path: "/v2/organization/groups",
|
|
3721
4906
|
params: [
|
|
4907
|
+
{
|
|
4908
|
+
name: "name",
|
|
4909
|
+
location: "query"
|
|
4910
|
+
},
|
|
3722
4911
|
{
|
|
3723
4912
|
name: "cursor",
|
|
3724
4913
|
location: "query"
|
|
@@ -3738,6 +4927,10 @@ var generatedTools = [
|
|
|
3738
4927
|
inputSchema: {
|
|
3739
4928
|
type: "object",
|
|
3740
4929
|
properties: {
|
|
4930
|
+
name: {
|
|
4931
|
+
type: "string",
|
|
4932
|
+
description: "Optional case-insensitive substring of the group name. An empty value applies no filter."
|
|
4933
|
+
},
|
|
3741
4934
|
cursor: {
|
|
3742
4935
|
type: "string",
|
|
3743
4936
|
minLength: 1,
|
|
@@ -3746,12 +4939,52 @@ var generatedTools = [
|
|
|
3746
4939
|
limit: {
|
|
3747
4940
|
type: "integer",
|
|
3748
4941
|
minimum: 1,
|
|
3749
|
-
maximum:
|
|
3750
|
-
description: "Page size, 1\
|
|
4942
|
+
maximum: 100,
|
|
4943
|
+
description: "Page size, 1\u2013100. Defaults to 100 when omitted."
|
|
3751
4944
|
}
|
|
3752
4945
|
}
|
|
3753
4946
|
}
|
|
3754
4947
|
},
|
|
4948
|
+
{
|
|
4949
|
+
name: "list-organization-invites",
|
|
4950
|
+
title: "List organization invites",
|
|
4951
|
+
operationId: "listOrganizationInvites",
|
|
4952
|
+
description: "List pending organization invites. Returns the pending invitations to the authenticated caller's organization, newest first. Only unexpired invites are pending: an invite leaves the list once it is accepted, revoked or expired. The list is complete and takes no pagination parameters, because an organization's pending invites are capped. Reading invites requires the organization's invite-management capability, which the built-in admin role holds; other members receive 403. Returns 404 when the caller does not belong to an organization, or 403 when organizations are unavailable to the caller.",
|
|
4953
|
+
method: "GET",
|
|
4954
|
+
path: "/v2/organization/invites",
|
|
4955
|
+
params: [],
|
|
4956
|
+
hasBody: false,
|
|
4957
|
+
annotations: {
|
|
4958
|
+
readOnlyHint: true,
|
|
4959
|
+
destructiveHint: false,
|
|
4960
|
+
idempotentHint: true,
|
|
4961
|
+
openWorldHint: true
|
|
4962
|
+
},
|
|
4963
|
+
inputSchema: {
|
|
4964
|
+
type: "object",
|
|
4965
|
+
properties: {}
|
|
4966
|
+
}
|
|
4967
|
+
},
|
|
4968
|
+
{
|
|
4969
|
+
name: "list-organization-roles",
|
|
4970
|
+
title: "List organization roles",
|
|
4971
|
+
operationId: "listOrganizationRoles",
|
|
4972
|
+
description: "List organization roles. Returns every role a member or invite of the authenticated caller's organization can hold: Runpod's built-in roles and the organization's custom roles, oldest first. The list is complete and takes no pagination parameters, because an organization's custom roles are capped. Returns 404 when the caller does not belong to an organization, or 403 when organizations are unavailable to the caller.",
|
|
4973
|
+
method: "GET",
|
|
4974
|
+
path: "/v2/organization/roles",
|
|
4975
|
+
params: [],
|
|
4976
|
+
hasBody: false,
|
|
4977
|
+
annotations: {
|
|
4978
|
+
readOnlyHint: true,
|
|
4979
|
+
destructiveHint: false,
|
|
4980
|
+
idempotentHint: true,
|
|
4981
|
+
openWorldHint: true
|
|
4982
|
+
},
|
|
4983
|
+
inputSchema: {
|
|
4984
|
+
type: "object",
|
|
4985
|
+
properties: {}
|
|
4986
|
+
}
|
|
4987
|
+
},
|
|
3755
4988
|
{
|
|
3756
4989
|
name: "list-organization-users",
|
|
3757
4990
|
title: "List organization users",
|
|
@@ -4106,6 +5339,47 @@ var generatedTools = [
|
|
|
4106
5339
|
}
|
|
4107
5340
|
}
|
|
4108
5341
|
},
|
|
5342
|
+
{
|
|
5343
|
+
name: "remove-organization-group-member",
|
|
5344
|
+
title: "Remove organization group member",
|
|
5345
|
+
operationId: "removeOrganizationGroupMember",
|
|
5346
|
+
description: "Remove a member from a group. Removes the organization member from the group. The group and user must belong to the current organization. Returns 404 when the membership is absent, including repeated deletion, or when the group is unknown or belongs to another organization.",
|
|
5347
|
+
method: "DELETE",
|
|
5348
|
+
path: "/v2/organization/groups/{id}/members/{userId}",
|
|
5349
|
+
params: [
|
|
5350
|
+
{
|
|
5351
|
+
name: "id",
|
|
5352
|
+
location: "path"
|
|
5353
|
+
},
|
|
5354
|
+
{
|
|
5355
|
+
name: "userId",
|
|
5356
|
+
location: "path"
|
|
5357
|
+
}
|
|
5358
|
+
],
|
|
5359
|
+
hasBody: false,
|
|
5360
|
+
annotations: {
|
|
5361
|
+
readOnlyHint: false,
|
|
5362
|
+
destructiveHint: true,
|
|
5363
|
+
idempotentHint: true,
|
|
5364
|
+
openWorldHint: true
|
|
5365
|
+
},
|
|
5366
|
+
inputSchema: {
|
|
5367
|
+
type: "object",
|
|
5368
|
+
properties: {
|
|
5369
|
+
id: {
|
|
5370
|
+
type: "string",
|
|
5371
|
+
minLength: 1,
|
|
5372
|
+
description: "Group ID."
|
|
5373
|
+
},
|
|
5374
|
+
userId: {
|
|
5375
|
+
type: "string",
|
|
5376
|
+
minLength: 1,
|
|
5377
|
+
description: "Organization member user ID."
|
|
5378
|
+
}
|
|
5379
|
+
},
|
|
5380
|
+
required: ["id", "userId"]
|
|
5381
|
+
}
|
|
5382
|
+
},
|
|
4109
5383
|
{
|
|
4110
5384
|
name: "revoke-delegation",
|
|
4111
5385
|
title: "Revoke ECR delegation",
|
|
@@ -4186,6 +5460,59 @@ var generatedTools = [
|
|
|
4186
5460
|
}
|
|
4187
5461
|
}
|
|
4188
5462
|
},
|
|
5463
|
+
{
|
|
5464
|
+
name: "update-cost-center",
|
|
5465
|
+
title: "Update cost center",
|
|
5466
|
+
operationId: "updateCostCenter",
|
|
5467
|
+
description: "Rename a cost center. Renames a cost center. Resources attributed to it are unaffected and follow the new name \u2014 the attribution is by identifier, not by name.",
|
|
5468
|
+
method: "PATCH",
|
|
5469
|
+
path: "/v2/cost-centers/{id}",
|
|
5470
|
+
params: [
|
|
5471
|
+
{
|
|
5472
|
+
name: "id",
|
|
5473
|
+
location: "path"
|
|
5474
|
+
}
|
|
5475
|
+
],
|
|
5476
|
+
hasBody: true,
|
|
5477
|
+
annotations: {
|
|
5478
|
+
readOnlyHint: false,
|
|
5479
|
+
destructiveHint: false,
|
|
5480
|
+
idempotentHint: true,
|
|
5481
|
+
openWorldHint: true
|
|
5482
|
+
},
|
|
5483
|
+
inputSchema: {
|
|
5484
|
+
type: "object",
|
|
5485
|
+
properties: {
|
|
5486
|
+
id: {
|
|
5487
|
+
type: "string",
|
|
5488
|
+
minLength: 1,
|
|
5489
|
+
description: "Cost center identifier."
|
|
5490
|
+
},
|
|
5491
|
+
body: {
|
|
5492
|
+
$ref: "#/$defs/UpdateCostCenterRequest",
|
|
5493
|
+
type: "object"
|
|
5494
|
+
}
|
|
5495
|
+
},
|
|
5496
|
+
required: ["id", "body"],
|
|
5497
|
+
$defs: {
|
|
5498
|
+
UpdateCostCenterRequest: {
|
|
5499
|
+
type: "object",
|
|
5500
|
+
additionalProperties: false,
|
|
5501
|
+
required: ["value"],
|
|
5502
|
+
properties: {
|
|
5503
|
+
value: {
|
|
5504
|
+
type: "string",
|
|
5505
|
+
minLength: 1,
|
|
5506
|
+
maxLength: 50,
|
|
5507
|
+
pattern: "^\\s*\\S",
|
|
5508
|
+
description: "Leading and trailing whitespace is trimmed.",
|
|
5509
|
+
examples: ["team-ml-eu"]
|
|
5510
|
+
}
|
|
5511
|
+
}
|
|
5512
|
+
}
|
|
5513
|
+
}
|
|
5514
|
+
}
|
|
5515
|
+
},
|
|
4189
5516
|
{
|
|
4190
5517
|
name: "update-endpoint",
|
|
4191
5518
|
title: "Update endpoint",
|
|
@@ -4573,19 +5900,130 @@ var generatedTools = [
|
|
|
4573
5900
|
}
|
|
4574
5901
|
}
|
|
4575
5902
|
}
|
|
4576
|
-
],
|
|
4577
|
-
unevaluatedProperties: false
|
|
5903
|
+
],
|
|
5904
|
+
unevaluatedProperties: false
|
|
5905
|
+
}
|
|
5906
|
+
}
|
|
5907
|
+
}
|
|
5908
|
+
},
|
|
5909
|
+
{
|
|
5910
|
+
name: "update-global-volume",
|
|
5911
|
+
title: "Update global volume",
|
|
5912
|
+
operationId: "updateGlobalVolume",
|
|
5913
|
+
description: "Update a global volume. Updates mutable fields on a global volume. Only provided fields are changed.",
|
|
5914
|
+
method: "PATCH",
|
|
5915
|
+
path: "/v2/global-volumes/{id}",
|
|
5916
|
+
params: [
|
|
5917
|
+
{
|
|
5918
|
+
name: "id",
|
|
5919
|
+
location: "path"
|
|
5920
|
+
}
|
|
5921
|
+
],
|
|
5922
|
+
hasBody: true,
|
|
5923
|
+
annotations: {
|
|
5924
|
+
readOnlyHint: false,
|
|
5925
|
+
destructiveHint: false,
|
|
5926
|
+
idempotentHint: true,
|
|
5927
|
+
openWorldHint: true
|
|
5928
|
+
},
|
|
5929
|
+
inputSchema: {
|
|
5930
|
+
type: "object",
|
|
5931
|
+
properties: {
|
|
5932
|
+
id: {
|
|
5933
|
+
type: "string",
|
|
5934
|
+
description: "Global volume identifier"
|
|
5935
|
+
},
|
|
5936
|
+
body: {
|
|
5937
|
+
$ref: "#/$defs/UpdateGlobalVolumeRequest",
|
|
5938
|
+
type: "object"
|
|
5939
|
+
}
|
|
5940
|
+
},
|
|
5941
|
+
required: ["id", "body"],
|
|
5942
|
+
$defs: {
|
|
5943
|
+
UpdateGlobalVolumeRequest: {
|
|
5944
|
+
type: "object",
|
|
5945
|
+
additionalProperties: false,
|
|
5946
|
+
minProperties: 1,
|
|
5947
|
+
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
5948
|
+
properties: {
|
|
5949
|
+
name: {
|
|
5950
|
+
type: "string",
|
|
5951
|
+
minLength: 1,
|
|
5952
|
+
maxLength: 191,
|
|
5953
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
5954
|
+
description: "New human-readable name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed.",
|
|
5955
|
+
examples: ["renamed-volume"]
|
|
5956
|
+
}
|
|
5957
|
+
}
|
|
5958
|
+
}
|
|
5959
|
+
}
|
|
5960
|
+
}
|
|
5961
|
+
},
|
|
5962
|
+
{
|
|
5963
|
+
name: "update-network-volume",
|
|
5964
|
+
title: "Update network volume",
|
|
5965
|
+
operationId: "updateNetworkVolume",
|
|
5966
|
+
description: "Update a network volume. Updates mutable fields on a network volume. Only provided fields are changed. Note: `size` may only increase; attempts to reduce size will be rejected.",
|
|
5967
|
+
method: "PATCH",
|
|
5968
|
+
path: "/v2/network-volumes/{id}",
|
|
5969
|
+
params: [
|
|
5970
|
+
{
|
|
5971
|
+
name: "id",
|
|
5972
|
+
location: "path"
|
|
5973
|
+
}
|
|
5974
|
+
],
|
|
5975
|
+
hasBody: true,
|
|
5976
|
+
annotations: {
|
|
5977
|
+
readOnlyHint: false,
|
|
5978
|
+
destructiveHint: false,
|
|
5979
|
+
idempotentHint: true,
|
|
5980
|
+
openWorldHint: true
|
|
5981
|
+
},
|
|
5982
|
+
inputSchema: {
|
|
5983
|
+
type: "object",
|
|
5984
|
+
properties: {
|
|
5985
|
+
id: {
|
|
5986
|
+
type: "string",
|
|
5987
|
+
description: "Network volume identifier"
|
|
5988
|
+
},
|
|
5989
|
+
body: {
|
|
5990
|
+
$ref: "#/$defs/UpdateNetworkVolumeRequest",
|
|
5991
|
+
type: "object"
|
|
5992
|
+
}
|
|
5993
|
+
},
|
|
5994
|
+
required: ["id", "body"],
|
|
5995
|
+
$defs: {
|
|
5996
|
+
UpdateNetworkVolumeRequest: {
|
|
5997
|
+
type: "object",
|
|
5998
|
+
additionalProperties: false,
|
|
5999
|
+
minProperties: 1,
|
|
6000
|
+
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
6001
|
+
properties: {
|
|
6002
|
+
name: {
|
|
6003
|
+
type: "string",
|
|
6004
|
+
minLength: 1,
|
|
6005
|
+
description: "New human-readable name",
|
|
6006
|
+
examples: ["renamed-volume"]
|
|
6007
|
+
},
|
|
6008
|
+
size: {
|
|
6009
|
+
type: "integer",
|
|
6010
|
+
minimum: 10,
|
|
6011
|
+
maximum: 4096,
|
|
6012
|
+
description: "New size in GB. Must be greater than or equal to the current size \u2014 network volume storage cannot be reduced.",
|
|
6013
|
+
examples: [100]
|
|
6014
|
+
}
|
|
6015
|
+
}
|
|
4578
6016
|
}
|
|
4579
6017
|
}
|
|
4580
6018
|
}
|
|
4581
6019
|
},
|
|
4582
6020
|
{
|
|
4583
|
-
name: "update-
|
|
4584
|
-
title: "Update
|
|
4585
|
-
operationId: "
|
|
4586
|
-
description: "
|
|
6021
|
+
name: "update-organization-group",
|
|
6022
|
+
title: "Update organization group",
|
|
6023
|
+
operationId: "updateOrganizationGroup",
|
|
6024
|
+
description: "Rename a group in your current organization",
|
|
4587
6025
|
method: "PATCH",
|
|
4588
|
-
path: "/v2/
|
|
6026
|
+
path: "/v2/organization/groups/{id}",
|
|
4589
6027
|
params: [
|
|
4590
6028
|
{
|
|
4591
6029
|
name: "id",
|
|
@@ -4604,27 +6042,28 @@ var generatedTools = [
|
|
|
4604
6042
|
properties: {
|
|
4605
6043
|
id: {
|
|
4606
6044
|
type: "string",
|
|
4607
|
-
|
|
6045
|
+
minLength: 1,
|
|
6046
|
+
description: "Group ID."
|
|
4608
6047
|
},
|
|
4609
6048
|
body: {
|
|
4610
|
-
$ref: "#/$defs/
|
|
6049
|
+
$ref: "#/$defs/UpdateOrganizationGroupRequest",
|
|
4611
6050
|
type: "object"
|
|
4612
6051
|
}
|
|
4613
6052
|
},
|
|
4614
6053
|
required: ["id", "body"],
|
|
4615
6054
|
$defs: {
|
|
4616
|
-
|
|
6055
|
+
UpdateOrganizationGroupRequest: {
|
|
4617
6056
|
type: "object",
|
|
4618
6057
|
additionalProperties: false,
|
|
4619
|
-
|
|
4620
|
-
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
6058
|
+
required: ["name"],
|
|
4621
6059
|
properties: {
|
|
4622
6060
|
name: {
|
|
4623
6061
|
type: "string",
|
|
4624
6062
|
minLength: 1,
|
|
4625
6063
|
maxLength: 191,
|
|
4626
|
-
|
|
4627
|
-
|
|
6064
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
6065
|
+
description: "Group name with at least one non-whitespace character; surrounding whitespace is trimmed.",
|
|
6066
|
+
examples: ["Research"]
|
|
4628
6067
|
}
|
|
4629
6068
|
}
|
|
4630
6069
|
}
|
|
@@ -4632,12 +6071,12 @@ var generatedTools = [
|
|
|
4632
6071
|
}
|
|
4633
6072
|
},
|
|
4634
6073
|
{
|
|
4635
|
-
name: "update-
|
|
4636
|
-
title: "Update
|
|
4637
|
-
operationId: "
|
|
4638
|
-
description: "Update a
|
|
6074
|
+
name: "update-organization-role",
|
|
6075
|
+
title: "Update organization role",
|
|
6076
|
+
operationId: "updateOrganizationRole",
|
|
6077
|
+
description: "Update a custom organization role. Changes a custom role's name, its capabilities, or both, and returns the role. Sent capabilities replace the whole grant set. Returns 400 for a built-in role, which cannot be changed; 404 when the ID is unknown or names another organization's role; 403 when the caller does not hold every capability the role grants, before or after the change; 409 when the organization already has a role with the new name; and 422 when a capability is unknown or the name is reserved. Updating roles requires the organization's role-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable.",
|
|
4639
6078
|
method: "PATCH",
|
|
4640
|
-
path: "/v2/
|
|
6079
|
+
path: "/v2/organization/roles/{id}",
|
|
4641
6080
|
params: [
|
|
4642
6081
|
{
|
|
4643
6082
|
name: "id",
|
|
@@ -4647,7 +6086,7 @@ var generatedTools = [
|
|
|
4647
6086
|
hasBody: true,
|
|
4648
6087
|
annotations: {
|
|
4649
6088
|
readOnlyHint: false,
|
|
4650
|
-
destructiveHint:
|
|
6089
|
+
destructiveHint: true,
|
|
4651
6090
|
idempotentHint: true,
|
|
4652
6091
|
openWorldHint: true
|
|
4653
6092
|
},
|
|
@@ -4656,33 +6095,129 @@ var generatedTools = [
|
|
|
4656
6095
|
properties: {
|
|
4657
6096
|
id: {
|
|
4658
6097
|
type: "string",
|
|
4659
|
-
description: "
|
|
6098
|
+
description: "Role identifier"
|
|
4660
6099
|
},
|
|
4661
6100
|
body: {
|
|
4662
|
-
$ref: "#/$defs/
|
|
6101
|
+
$ref: "#/$defs/UpdateOrganizationRoleRequest",
|
|
4663
6102
|
type: "object"
|
|
4664
6103
|
}
|
|
4665
6104
|
},
|
|
4666
6105
|
required: ["id", "body"],
|
|
4667
6106
|
$defs: {
|
|
4668
|
-
|
|
6107
|
+
OrganizationRoleCapabilitiesInput: {
|
|
6108
|
+
type: "array",
|
|
6109
|
+
description: "What the role grants, as `FAMILY:VERB` capabilities from `get-organization-role-capabilities`. The caller must hold every capability it lists.",
|
|
6110
|
+
minItems: 1,
|
|
6111
|
+
uniqueItems: true,
|
|
6112
|
+
items: {
|
|
6113
|
+
type: "string",
|
|
6114
|
+
pattern: "^[A-Z0-9_]+:[A-Z0-9_]+$"
|
|
6115
|
+
},
|
|
6116
|
+
examples: [["POD:VIEW"]]
|
|
6117
|
+
},
|
|
6118
|
+
OrganizationRoleName: {
|
|
6119
|
+
type: "string",
|
|
6120
|
+
minLength: 1,
|
|
6121
|
+
maxLength: 191,
|
|
6122
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
6123
|
+
description: "Display name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed. It must be unique within the organization and cannot be a built-in role's name.",
|
|
6124
|
+
examples: ["Pod viewer"]
|
|
6125
|
+
},
|
|
6126
|
+
UpdateOrganizationRoleRequest: {
|
|
4669
6127
|
type: "object",
|
|
4670
6128
|
additionalProperties: false,
|
|
4671
6129
|
minProperties: 1,
|
|
4672
|
-
description: "
|
|
6130
|
+
description: "The fields to change; omitted fields are unchanged. `capabilities` replaces the role's whole grant set rather than adding to it.",
|
|
4673
6131
|
properties: {
|
|
4674
6132
|
name: {
|
|
6133
|
+
$ref: "#/$defs/OrganizationRoleName"
|
|
6134
|
+
},
|
|
6135
|
+
capabilities: {
|
|
6136
|
+
$ref: "#/$defs/OrganizationRoleCapabilitiesInput"
|
|
6137
|
+
}
|
|
6138
|
+
}
|
|
6139
|
+
}
|
|
6140
|
+
}
|
|
6141
|
+
}
|
|
6142
|
+
},
|
|
6143
|
+
{
|
|
6144
|
+
name: "update-organization-user",
|
|
6145
|
+
title: "Update organization user",
|
|
6146
|
+
operationId: "updateOrganizationUser",
|
|
6147
|
+
description: "Update an organization member. Changes one member of the authenticated caller's organization by user ID: assigns a role, replaces their set of groups, or both, applied together or not at all. Send at least one field; an omitted field is left as it is, and an empty `groups` list removes the member from every group. Updating members requires the organization's member-management capability, which the built-in admin role holds; other members, and callers outside an organization, receive 403, as does a caller for whom organizations are unavailable. Returns 403 when the caller changes their own role or assigns a role granting a capability the caller lacks; 409 when the change would leave the organization without a member in the built-in admin role; and 404 when the user is not a member or the role or a group is unknown to the organization, with the detail naming which.",
|
|
6148
|
+
method: "PATCH",
|
|
6149
|
+
path: "/v2/organization/users/{id}",
|
|
6150
|
+
params: [
|
|
6151
|
+
{
|
|
6152
|
+
name: "id",
|
|
6153
|
+
location: "path"
|
|
6154
|
+
}
|
|
6155
|
+
],
|
|
6156
|
+
hasBody: true,
|
|
6157
|
+
annotations: {
|
|
6158
|
+
readOnlyHint: false,
|
|
6159
|
+
destructiveHint: true,
|
|
6160
|
+
idempotentHint: true,
|
|
6161
|
+
openWorldHint: true
|
|
6162
|
+
},
|
|
6163
|
+
inputSchema: {
|
|
6164
|
+
type: "object",
|
|
6165
|
+
properties: {
|
|
6166
|
+
id: {
|
|
6167
|
+
type: "string",
|
|
6168
|
+
description: "User identifier"
|
|
6169
|
+
},
|
|
6170
|
+
body: {
|
|
6171
|
+
$ref: "#/$defs/UpdateOrganizationUserRequest",
|
|
6172
|
+
type: "object"
|
|
6173
|
+
}
|
|
6174
|
+
},
|
|
6175
|
+
required: ["id", "body"],
|
|
6176
|
+
$defs: {
|
|
6177
|
+
OrganizationGroupInput: {
|
|
6178
|
+
type: "object",
|
|
6179
|
+
description: "An organization group, by ID.",
|
|
6180
|
+
additionalProperties: false,
|
|
6181
|
+
required: ["id"],
|
|
6182
|
+
properties: {
|
|
6183
|
+
id: {
|
|
4675
6184
|
type: "string",
|
|
4676
6185
|
minLength: 1,
|
|
4677
|
-
description: "
|
|
4678
|
-
examples: ["
|
|
6186
|
+
description: "Group ID.",
|
|
6187
|
+
examples: ["group_id_abc_123"]
|
|
6188
|
+
}
|
|
6189
|
+
}
|
|
6190
|
+
},
|
|
6191
|
+
OrganizationRoleInput: {
|
|
6192
|
+
type: "object",
|
|
6193
|
+
description: "An organization role to assign, by ID.",
|
|
6194
|
+
additionalProperties: false,
|
|
6195
|
+
required: ["id"],
|
|
6196
|
+
properties: {
|
|
6197
|
+
id: {
|
|
6198
|
+
type: "string",
|
|
6199
|
+
minLength: 1,
|
|
6200
|
+
description: "Role ID, as reported on a member or an invite: `builtin:admin`, `builtin:dev`, `builtin:billing`, `builtin:basic`, or a custom role's own ID.",
|
|
6201
|
+
examples: ["builtin:dev"]
|
|
6202
|
+
}
|
|
6203
|
+
}
|
|
6204
|
+
},
|
|
6205
|
+
UpdateOrganizationUserRequest: {
|
|
6206
|
+
type: "object",
|
|
6207
|
+
description: "Changes to a member. Send `role`, `groups`, or both; an omitted field is left as it is.",
|
|
6208
|
+
additionalProperties: false,
|
|
6209
|
+
minProperties: 1,
|
|
6210
|
+
properties: {
|
|
6211
|
+
role: {
|
|
6212
|
+
$ref: "#/$defs/OrganizationRoleInput"
|
|
4679
6213
|
},
|
|
4680
|
-
|
|
4681
|
-
type: "
|
|
4682
|
-
|
|
4683
|
-
|
|
4684
|
-
|
|
4685
|
-
|
|
6214
|
+
groups: {
|
|
6215
|
+
type: "array",
|
|
6216
|
+
description: "The member's groups after the change: the whole set, by ID. An empty list removes the member from every group.",
|
|
6217
|
+
uniqueItems: true,
|
|
6218
|
+
items: {
|
|
6219
|
+
$ref: "#/$defs/OrganizationGroupInput"
|
|
6220
|
+
}
|
|
4686
6221
|
}
|
|
4687
6222
|
}
|
|
4688
6223
|
}
|
|
@@ -4693,7 +6228,7 @@ var generatedTools = [
|
|
|
4693
6228
|
name: "update-pod",
|
|
4694
6229
|
title: "Update Pod",
|
|
4695
6230
|
operationId: "updatePod",
|
|
4696
|
-
description: "Update a pod. Partially updates a pod's configuration. This is a PATCH: only the fields present in the body are changed, and omitted fields are left untouched. Use empty values only when you explicitly mean to clear a field (for example, set `registry` to `null` or set `ports` to `[]`). See `UpdatePodRequest` for the full body. Mutable fields: `name`, `image`, `args`, `disk`, `ports`, `env`, `registry`, `mounts`, `locked`, and `globalNetworking`. Some changes apply immediately while others (e.g. `globalNetworking`) take effect on the pod's next start/restart, as noted on the individual fields. Pods that belong to a Cluster cannot be updated here \u2014 manage them through `/v2/clusters/{id}`. Returns `200` with the full updated pod.",
|
|
6231
|
+
description: "Update a pod. Partially updates a pod's configuration. This is a PATCH: only the fields present in the body are changed, and omitted fields are left untouched. Use empty values only when you explicitly mean to clear a field (for example, set `registry` to `null` or set `ports` to `[]`). See `UpdatePodRequest` for the full body. Mutable fields: `name`, `image`, `args`, `disk`, `ports`, `env`, `registry`, `mounts`, `locked`, and `globalNetworking`. Some changes apply immediately while others (e.g. `globalNetworking`) take effect on the pod's next start/restart, as noted on the individual fields. Volumes can be mounted, moved, or unmounted after creation through `mounts`, one entry per volume; see `UpdatePodMounts` for the rules. Pods that belong to a Cluster cannot be updated here \u2014 manage them through `/v2/clusters/{id}`. Returns `200` with the full updated pod.",
|
|
4697
6232
|
method: "PATCH",
|
|
4698
6233
|
path: "/v2/pods/{id}",
|
|
4699
6234
|
params: [
|
|
@@ -4787,21 +6322,6 @@ var generatedTools = [
|
|
|
4787
6322
|
}
|
|
4788
6323
|
}
|
|
4789
6324
|
},
|
|
4790
|
-
BaseMounts: {
|
|
4791
|
-
type: "object",
|
|
4792
|
-
properties: {
|
|
4793
|
-
persistent: {
|
|
4794
|
-
$ref: "#/$defs/PersistentMount"
|
|
4795
|
-
},
|
|
4796
|
-
network: {
|
|
4797
|
-
type: "array",
|
|
4798
|
-
maxItems: 1,
|
|
4799
|
-
items: {
|
|
4800
|
-
$ref: "#/$defs/NetworkMount"
|
|
4801
|
-
}
|
|
4802
|
-
}
|
|
4803
|
-
}
|
|
4804
|
-
},
|
|
4805
6325
|
ContainerConfig: {
|
|
4806
6326
|
allOf: [
|
|
4807
6327
|
{
|
|
@@ -4819,11 +6339,11 @@ var generatedTools = [
|
|
|
4819
6339
|
}
|
|
4820
6340
|
]
|
|
4821
6341
|
},
|
|
4822
|
-
|
|
6342
|
+
GlobalMountPatch: {
|
|
4823
6343
|
type: "object",
|
|
4824
6344
|
required: ["volumeId"],
|
|
4825
6345
|
additionalProperties: false,
|
|
4826
|
-
description: "
|
|
6346
|
+
description: "Mounts, moves, or unmounts the pod's global volume.",
|
|
4827
6347
|
properties: {
|
|
4828
6348
|
volumeId: {
|
|
4829
6349
|
type: "string",
|
|
@@ -4832,38 +6352,21 @@ var generatedTools = [
|
|
|
4832
6352
|
},
|
|
4833
6353
|
path: {
|
|
4834
6354
|
type: "string",
|
|
4835
|
-
|
|
6355
|
+
minLength: 1,
|
|
6356
|
+
description: "Mount path inside the container. Optional; when mounting, a default is chosen for you if omitted.",
|
|
4836
6357
|
examples: ["/data"]
|
|
4837
|
-
}
|
|
4838
|
-
}
|
|
4839
|
-
},
|
|
4840
|
-
Mounts: {
|
|
4841
|
-
description: "Storage mounts for the pod: `persistent` (size + path) excludes both `network` and `global`; `network` (volumeId + path) and `global` (volumeId, optional path) take one entry each and can be combined. Every entry needs its full shape. On update, omit the field to leave the mounts as they are; the mount kind and a volume's volumeId cannot change, and mounts cannot be cleared.",
|
|
4842
|
-
allOf: [
|
|
4843
|
-
{
|
|
4844
|
-
$ref: "#/$defs/BaseMounts"
|
|
4845
6358
|
},
|
|
4846
|
-
{
|
|
4847
|
-
type: "
|
|
4848
|
-
|
|
4849
|
-
global: {
|
|
4850
|
-
type: "array",
|
|
4851
|
-
maxItems: 1,
|
|
4852
|
-
description: "At most one global volume, on GPU and CPU pods, with no data center constraint. Combinable with `network` but not with `persistent` (rejected): upstream drops a persistent disk whenever a volume is attached.",
|
|
4853
|
-
items: {
|
|
4854
|
-
$ref: "#/$defs/GlobalMount"
|
|
4855
|
-
}
|
|
4856
|
-
}
|
|
4857
|
-
}
|
|
6359
|
+
remove: {
|
|
6360
|
+
type: "boolean",
|
|
6361
|
+
description: "Unmount the volume. Cannot be combined with `path`."
|
|
4858
6362
|
}
|
|
4859
|
-
|
|
4860
|
-
unevaluatedProperties: false
|
|
6363
|
+
}
|
|
4861
6364
|
},
|
|
4862
|
-
|
|
6365
|
+
NetworkMountPatch: {
|
|
4863
6366
|
type: "object",
|
|
4864
|
-
required: ["volumeId"
|
|
6367
|
+
required: ["volumeId"],
|
|
4865
6368
|
additionalProperties: false,
|
|
4866
|
-
description: "
|
|
6369
|
+
description: "Mounts, moves, or unmounts one network volume. Mounting a volume the pod does not have requires `path`.",
|
|
4867
6370
|
properties: {
|
|
4868
6371
|
volumeId: {
|
|
4869
6372
|
type: "string",
|
|
@@ -4872,27 +6375,62 @@ var generatedTools = [
|
|
|
4872
6375
|
},
|
|
4873
6376
|
path: {
|
|
4874
6377
|
type: "string",
|
|
4875
|
-
|
|
6378
|
+
minLength: 1,
|
|
6379
|
+
description: "Mount path inside the container. Required when mounting; optional when moving a mounted volume.",
|
|
4876
6380
|
examples: ["/runpod-volume"]
|
|
6381
|
+
},
|
|
6382
|
+
remove: {
|
|
6383
|
+
type: "boolean",
|
|
6384
|
+
description: "Unmount the volume. Cannot be combined with `path`."
|
|
4877
6385
|
}
|
|
4878
6386
|
}
|
|
4879
6387
|
},
|
|
4880
|
-
|
|
6388
|
+
PersistentMountPatch: {
|
|
4881
6389
|
type: "object",
|
|
4882
|
-
required: ["size", "path"],
|
|
4883
6390
|
additionalProperties: false,
|
|
4884
|
-
description: "
|
|
6391
|
+
description: "Adds the pod's volume disk, grows it, or moves it. Adding a disk requires `size`; on a pod that already has one, omitted fields are left as they are. Not available on CPU pods.",
|
|
4885
6392
|
properties: {
|
|
4886
6393
|
size: {
|
|
4887
6394
|
type: "integer",
|
|
4888
6395
|
minimum: 10,
|
|
4889
|
-
description: "
|
|
4890
|
-
examples: [
|
|
6396
|
+
description: "Volume disk size in GB. Can only grow; a smaller size than the current one is rejected.",
|
|
6397
|
+
examples: [50]
|
|
4891
6398
|
},
|
|
4892
6399
|
path: {
|
|
4893
6400
|
type: "string",
|
|
4894
|
-
|
|
6401
|
+
minLength: 1,
|
|
6402
|
+
description: "Mount path inside the container.",
|
|
4895
6403
|
examples: ["/workspace"]
|
|
6404
|
+
},
|
|
6405
|
+
remove: {
|
|
6406
|
+
type: "boolean",
|
|
6407
|
+
description: "Removes the volume disk. Not supported yet: `remove: true` is rejected."
|
|
6408
|
+
}
|
|
6409
|
+
}
|
|
6410
|
+
},
|
|
6411
|
+
UpdatePodMounts: {
|
|
6412
|
+
type: "object",
|
|
6413
|
+
additionalProperties: false,
|
|
6414
|
+
description: "Changes to a pod's mounts. Each entry names one volume by `volumeId` and changes only that volume; volumes that are not listed, and kinds that are omitted, are left as they are. Omitting `mounts` or sending `{}` changes nothing.",
|
|
6415
|
+
properties: {
|
|
6416
|
+
persistent: {
|
|
6417
|
+
$ref: "#/$defs/PersistentMountPatch"
|
|
6418
|
+
},
|
|
6419
|
+
network: {
|
|
6420
|
+
type: "array",
|
|
6421
|
+
maxItems: 8,
|
|
6422
|
+
description: "Network volumes to mount, move, or unmount. Up to 8 entries, so a request can unmount 4 volumes and mount 4 others; the pod can still hold at most 4 afterwards.",
|
|
6423
|
+
items: {
|
|
6424
|
+
$ref: "#/$defs/NetworkMountPatch"
|
|
6425
|
+
}
|
|
6426
|
+
},
|
|
6427
|
+
global: {
|
|
6428
|
+
type: "array",
|
|
6429
|
+
maxItems: 2,
|
|
6430
|
+
description: "Global volumes to mount, move, or unmount. Up to 2 entries, so a request can swap the global volume; the pod can still hold at most 1 afterwards.",
|
|
6431
|
+
items: {
|
|
6432
|
+
$ref: "#/$defs/GlobalMountPatch"
|
|
6433
|
+
}
|
|
4896
6434
|
}
|
|
4897
6435
|
}
|
|
4898
6436
|
},
|
|
@@ -4913,7 +6451,7 @@ var generatedTools = [
|
|
|
4913
6451
|
description: "Lock the pod (true) or unlock it (false). Locked pods cannot be stopped or reset."
|
|
4914
6452
|
},
|
|
4915
6453
|
mounts: {
|
|
4916
|
-
$ref: "#/$defs/
|
|
6454
|
+
$ref: "#/$defs/UpdatePodMounts"
|
|
4917
6455
|
},
|
|
4918
6456
|
name: {
|
|
4919
6457
|
type: "string",
|
|
@@ -5160,7 +6698,7 @@ var generatedTools = [
|
|
|
5160
6698
|
size: {
|
|
5161
6699
|
type: "integer",
|
|
5162
6700
|
minimum: 10,
|
|
5163
|
-
description: "Host-local persistent storage in GB.
|
|
6701
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
5164
6702
|
examples: [20]
|
|
5165
6703
|
},
|
|
5166
6704
|
path: {
|
|
@@ -5420,33 +6958,53 @@ var CREDENTIAL_MANAGEMENT = "Manages stored credentials; OpenAI restricts plugin
|
|
|
5420
6958
|
var CREDENTIAL_INPUT = "Takes a secret or password as input; directories forbid collecting credentials.";
|
|
5421
6959
|
var ALP = "Collects conversation-derived data beyond the task; the directory profile never serves it.";
|
|
5422
6960
|
var DIRECTORY_TOOLS = {
|
|
6961
|
+
"add-organization-group-member": IN,
|
|
6962
|
+
"attach-cost-center-resource": IN,
|
|
5423
6963
|
"cancel-job": IN,
|
|
5424
6964
|
"create-cluster": IN,
|
|
6965
|
+
"create-cost-center": IN,
|
|
5425
6966
|
"create-delegation": IN,
|
|
5426
6967
|
"create-endpoint": IN,
|
|
5427
6968
|
"create-global-volume": IN,
|
|
5428
6969
|
"create-network-volume": IN,
|
|
6970
|
+
"create-organization-group": IN,
|
|
6971
|
+
"create-organization-invite": IN,
|
|
6972
|
+
"create-organization-role": IN,
|
|
5429
6973
|
"create-pod": IN,
|
|
5430
6974
|
"create-template": IN,
|
|
5431
6975
|
"delete-cluster": IN,
|
|
6976
|
+
"delete-cost-center": IN,
|
|
5432
6977
|
"delete-endpoint": IN,
|
|
5433
6978
|
"delete-global-volume": IN,
|
|
5434
6979
|
"delete-network-volume": IN,
|
|
6980
|
+
"delete-organization-group": IN,
|
|
6981
|
+
"delete-organization-invite": IN,
|
|
6982
|
+
"delete-organization-role": IN,
|
|
6983
|
+
"delete-organization-user": IN,
|
|
5435
6984
|
"delete-pod": IN,
|
|
5436
6985
|
"delete-template": IN,
|
|
5437
6986
|
"deploy-hub-repo": IN,
|
|
6987
|
+
"detach-cost-center-resource": IN,
|
|
5438
6988
|
"endpoint-health": IN,
|
|
5439
6989
|
"get-capacity": IN,
|
|
5440
6990
|
"get-cluster": IN,
|
|
6991
|
+
"get-cost-center": IN,
|
|
5441
6992
|
"get-cpu-type": IN,
|
|
5442
6993
|
"get-data-center": IN,
|
|
5443
6994
|
"get-endpoint": IN,
|
|
5444
6995
|
"get-endpoint-build": IN,
|
|
6996
|
+
"get-endpoint-cold-start-metrics": IN,
|
|
6997
|
+
"get-endpoint-request-metrics": IN,
|
|
6998
|
+
"get-endpoint-worker-metrics": IN,
|
|
5445
6999
|
"get-global-volume": IN,
|
|
5446
7000
|
"get-gpu-type": IN,
|
|
5447
7001
|
"get-job-status": IN,
|
|
5448
7002
|
"get-network-volume": IN,
|
|
5449
7003
|
"get-organization": IN,
|
|
7004
|
+
"get-organization-group": IN,
|
|
7005
|
+
"get-organization-invite": IN,
|
|
7006
|
+
"get-organization-role": IN,
|
|
7007
|
+
"get-organization-role-capabilities": IN,
|
|
5450
7008
|
"get-organization-user": IN,
|
|
5451
7009
|
"get-pod": IN,
|
|
5452
7010
|
"get-ssh-keys": IN,
|
|
@@ -5456,6 +7014,8 @@ var DIRECTORY_TOOLS = {
|
|
|
5456
7014
|
"list-cluster-billing": IN,
|
|
5457
7015
|
"list-cluster-pods": IN,
|
|
5458
7016
|
"list-clusters": IN,
|
|
7017
|
+
"list-cost-center-resources": IN,
|
|
7018
|
+
"list-cost-centers": IN,
|
|
5459
7019
|
"list-cpu-types": IN,
|
|
5460
7020
|
"list-data-centers": IN,
|
|
5461
7021
|
"list-delegations": IN,
|
|
@@ -5469,6 +7029,10 @@ var DIRECTORY_TOOLS = {
|
|
|
5469
7029
|
"list-hub-repos": IN,
|
|
5470
7030
|
"list-network-volume-billing": IN,
|
|
5471
7031
|
"list-network-volumes": IN,
|
|
7032
|
+
"list-organization-group-members": IN,
|
|
7033
|
+
"list-organization-groups": IN,
|
|
7034
|
+
"list-organization-invites": IN,
|
|
7035
|
+
"list-organization-roles": IN,
|
|
5472
7036
|
"list-organization-users": IN,
|
|
5473
7037
|
"list-pod-billing": IN,
|
|
5474
7038
|
"list-pods": IN,
|
|
@@ -5478,6 +7042,7 @@ var DIRECTORY_TOOLS = {
|
|
|
5478
7042
|
"list-templates": IN,
|
|
5479
7043
|
"lookup-concept": IN,
|
|
5480
7044
|
"purge-endpoint-queue": IN,
|
|
7045
|
+
"remove-organization-group-member": IN,
|
|
5481
7046
|
"retry-job": IN,
|
|
5482
7047
|
"revoke-delegation": IN,
|
|
5483
7048
|
"search-concepts": IN,
|
|
@@ -5487,9 +7052,13 @@ var DIRECTORY_TOOLS = {
|
|
|
5487
7052
|
"stream-pod-logs": IN,
|
|
5488
7053
|
"stream-worker-logs": IN,
|
|
5489
7054
|
"update-cluster": IN,
|
|
7055
|
+
"update-cost-center": IN,
|
|
5490
7056
|
"update-endpoint": IN,
|
|
5491
7057
|
"update-global-volume": IN,
|
|
5492
7058
|
"update-network-volume": IN,
|
|
7059
|
+
"update-organization-group": IN,
|
|
7060
|
+
"update-organization-role": IN,
|
|
7061
|
+
"update-organization-user": IN,
|
|
5493
7062
|
"update-pod": IN,
|
|
5494
7063
|
"update-ssh-keys": IN,
|
|
5495
7064
|
"update-template": IN,
|
|
@@ -8287,23 +9856,40 @@ function createRunpodClient(options = {}) {
|
|
|
8287
9856
|
// src/specgen/clients/sse.ts
|
|
8288
9857
|
var LOG_STREAM_DEFAULT_WAIT_MS = 5e3;
|
|
8289
9858
|
var LOG_STREAM_MAX_BYTES = 256 * 1024;
|
|
9859
|
+
var LOG_STREAM_CONNECT_TIMEOUT_MS = 1e4;
|
|
9860
|
+
var LOG_SNAPSHOT_MAX_CHARS = 32e3;
|
|
8290
9861
|
function createSseReader(options = {}) {
|
|
8291
9862
|
const apiKey = options.apiKey ?? process.env.RUNPOD_API_KEY;
|
|
8292
9863
|
const fetchImpl = options.fetchImpl ?? fetch;
|
|
9864
|
+
const connectTimeoutMs = options.connectTimeoutMs ?? LOG_STREAM_CONNECT_TIMEOUT_MS;
|
|
8293
9865
|
return async (url, opts) => {
|
|
8294
9866
|
if (!apiKey) throw missingKeyError();
|
|
8295
9867
|
const chunks = [];
|
|
8296
9868
|
let bytes = 0;
|
|
8297
9869
|
let truncated = false;
|
|
8298
9870
|
let streamEstablished = false;
|
|
9871
|
+
const connect = new AbortController();
|
|
9872
|
+
const connectTimer = setTimeout(
|
|
9873
|
+
() => connect.abort(
|
|
9874
|
+
new DOMException(
|
|
9875
|
+
`Runpod log stream sent no headers within ${connectTimeoutMs}ms`,
|
|
9876
|
+
"TimeoutError"
|
|
9877
|
+
)
|
|
9878
|
+
),
|
|
9879
|
+
connectTimeoutMs
|
|
9880
|
+
);
|
|
8299
9881
|
try {
|
|
8300
|
-
const response = await createDeadlineFetch(
|
|
9882
|
+
const response = await createDeadlineFetch(
|
|
9883
|
+
fetchImpl,
|
|
9884
|
+
connectTimeoutMs + opts.maxWaitMs
|
|
9885
|
+
)(url, {
|
|
8301
9886
|
method: "GET",
|
|
8302
9887
|
headers: {
|
|
8303
9888
|
Authorization: `Bearer ${apiKey}`,
|
|
8304
9889
|
Accept: "text/event-stream"
|
|
8305
|
-
}
|
|
8306
|
-
|
|
9890
|
+
},
|
|
9891
|
+
signal: connect.signal
|
|
9892
|
+
}).finally(() => clearTimeout(connectTimer));
|
|
8307
9893
|
if (!response.ok) {
|
|
8308
9894
|
const body = await response.text().catch(() => "");
|
|
8309
9895
|
throw new HttpError(
|
|
@@ -8314,14 +9900,31 @@ function createSseReader(options = {}) {
|
|
|
8314
9900
|
}
|
|
8315
9901
|
streamEstablished = true;
|
|
8316
9902
|
if (response.body) {
|
|
8317
|
-
|
|
8318
|
-
|
|
8319
|
-
|
|
8320
|
-
|
|
8321
|
-
|
|
8322
|
-
|
|
8323
|
-
|
|
9903
|
+
const reader = response.body.getReader();
|
|
9904
|
+
let timer;
|
|
9905
|
+
const windowClosed = new Promise((resolve) => {
|
|
9906
|
+
timer = setTimeout(() => resolve(null), opts.maxWaitMs);
|
|
9907
|
+
});
|
|
9908
|
+
try {
|
|
9909
|
+
for (; ; ) {
|
|
9910
|
+
const read = reader.read();
|
|
9911
|
+
read.catch(() => {
|
|
9912
|
+
});
|
|
9913
|
+
const next = await Promise.race([read, windowClosed]);
|
|
9914
|
+
if (next === null || next.done) break;
|
|
9915
|
+
const boundedChunk = next.value.subarray(0, opts.maxBytes - bytes);
|
|
9916
|
+
chunks.push(boundedChunk);
|
|
9917
|
+
bytes += boundedChunk.length;
|
|
9918
|
+
if (bytes >= opts.maxBytes) {
|
|
9919
|
+
truncated = true;
|
|
9920
|
+
break;
|
|
9921
|
+
}
|
|
8324
9922
|
}
|
|
9923
|
+
} finally {
|
|
9924
|
+
clearTimeout(timer);
|
|
9925
|
+
void reader.cancel().catch(() => {
|
|
9926
|
+
});
|
|
9927
|
+
reader.releaseLock();
|
|
8325
9928
|
}
|
|
8326
9929
|
}
|
|
8327
9930
|
} catch (err) {
|
|
@@ -8347,7 +9950,80 @@ async function collectLogSnapshot(reader, logsUrl, params) {
|
|
|
8347
9950
|
for await (const event of iterateLogEvents(new Response(raw).body)) {
|
|
8348
9951
|
items.push(event.data);
|
|
8349
9952
|
}
|
|
8350
|
-
return
|
|
9953
|
+
return fitSnapshot(items, truncated);
|
|
9954
|
+
}
|
|
9955
|
+
var serializedLength = (snapshot) => JSON.stringify(snapshot, null, 2).length;
|
|
9956
|
+
var LOG_ENTRY_MAX_CHARS = 16e3;
|
|
9957
|
+
var CLIPPABLE_KEYS = ["line", "raw"];
|
|
9958
|
+
function clipText(text, keep) {
|
|
9959
|
+
const code = text.charCodeAt(keep - 1);
|
|
9960
|
+
if (keep > 0 && code >= 55296 && code <= 56319) keep--;
|
|
9961
|
+
return `${text.slice(0, keep)}\u2026 [clipped ${text.length - keep} chars]`;
|
|
9962
|
+
}
|
|
9963
|
+
function clipEntry(entry) {
|
|
9964
|
+
let clipped = false;
|
|
9965
|
+
const out = { ...entry };
|
|
9966
|
+
for (const key of CLIPPABLE_KEYS) {
|
|
9967
|
+
const text = out[key];
|
|
9968
|
+
if (typeof text === "string" && text.length > LOG_ENTRY_MAX_CHARS) {
|
|
9969
|
+
out[key] = clipText(text, LOG_ENTRY_MAX_CHARS);
|
|
9970
|
+
clipped = true;
|
|
9971
|
+
}
|
|
9972
|
+
}
|
|
9973
|
+
return { entry: out, clipped };
|
|
9974
|
+
}
|
|
9975
|
+
function fitEntry(entry, maxChars) {
|
|
9976
|
+
const size = (e) => serializedLength({ items: [e], count: 1, truncated: false });
|
|
9977
|
+
const out = { ...entry };
|
|
9978
|
+
const keys = Object.keys(out).filter((key) => key !== "ts" && typeof out[key] === "string").sort((a, b) => out[b].length - out[a].length);
|
|
9979
|
+
for (const key of keys) {
|
|
9980
|
+
if (size(out) <= maxChars) break;
|
|
9981
|
+
const text = entry[key];
|
|
9982
|
+
let lo = 0;
|
|
9983
|
+
let hi = Math.min(text.length, LOG_ENTRY_MAX_CHARS);
|
|
9984
|
+
while (lo < hi) {
|
|
9985
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
9986
|
+
if (size({ ...out, [key]: clipText(text, mid) }) <= maxChars)
|
|
9987
|
+
lo = mid;
|
|
9988
|
+
else hi = mid - 1;
|
|
9989
|
+
}
|
|
9990
|
+
out[key] = clipText(text, lo);
|
|
9991
|
+
}
|
|
9992
|
+
return out;
|
|
9993
|
+
}
|
|
9994
|
+
var entryTs = (entry) => entry?.ts;
|
|
9995
|
+
function fitSnapshot(items, truncated, maxChars = LOG_SNAPSHOT_MAX_CHARS) {
|
|
9996
|
+
let cut = truncated;
|
|
9997
|
+
const entries = items.map((item) => {
|
|
9998
|
+
const { entry, clipped } = clipEntry(item);
|
|
9999
|
+
if (clipped) cut = true;
|
|
10000
|
+
return entry;
|
|
10001
|
+
});
|
|
10002
|
+
const snapshot = (n, isCut) => ({
|
|
10003
|
+
items: entries.slice(0, n),
|
|
10004
|
+
count: n,
|
|
10005
|
+
truncated: isCut
|
|
10006
|
+
});
|
|
10007
|
+
const whole = snapshot(entries.length, cut);
|
|
10008
|
+
if (entries.length === 0 || serializedLength(whole) <= maxChars) return whole;
|
|
10009
|
+
if (serializedLength(snapshot(1, true)) > maxChars) {
|
|
10010
|
+
entries[0] = fitEntry(items[0], maxChars);
|
|
10011
|
+
if (entries.length === 1) return snapshot(1, true);
|
|
10012
|
+
}
|
|
10013
|
+
let lo = 1;
|
|
10014
|
+
let hi = entries.length - 1;
|
|
10015
|
+
while (lo < hi) {
|
|
10016
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
10017
|
+
if (serializedLength(snapshot(mid, true)) <= maxChars) lo = mid;
|
|
10018
|
+
else hi = mid - 1;
|
|
10019
|
+
}
|
|
10020
|
+
let keep = lo;
|
|
10021
|
+
const omittedTs = entryTs(entries[keep]);
|
|
10022
|
+
if (omittedTs !== void 0) {
|
|
10023
|
+
while (keep > 0 && entryTs(entries[keep - 1]) === omittedTs) keep--;
|
|
10024
|
+
if (keep === 0) keep = lo;
|
|
10025
|
+
}
|
|
10026
|
+
return snapshot(keep, true);
|
|
8351
10027
|
}
|
|
8352
10028
|
|
|
8353
10029
|
// src/specgen/tools/logs.ts
|
|
@@ -8365,13 +10041,13 @@ var logStreamProperties = {
|
|
|
8365
10041
|
},
|
|
8366
10042
|
since: {
|
|
8367
10043
|
type: "string",
|
|
8368
|
-
description: "RFC3339 timestamp to resume
|
|
10044
|
+
description: "RFC3339 timestamp to resume after (exclusive). Replays container lines only; system lines stream live from the call. When set, `tail` is ignored."
|
|
8369
10045
|
},
|
|
8370
10046
|
maxWaitMs: {
|
|
8371
10047
|
type: "integer",
|
|
8372
10048
|
minimum: 500,
|
|
8373
10049
|
maximum: 3e4,
|
|
8374
|
-
description: "How long to read the stream, in ms (default 5000, max 30000)"
|
|
10050
|
+
description: "How long to read the stream once it opens, in ms (default 5000, max 30000)"
|
|
8375
10051
|
}
|
|
8376
10052
|
};
|
|
8377
10053
|
function baseUrl() {
|
|
@@ -8397,7 +10073,7 @@ var streamPodLogs = {
|
|
|
8397
10073
|
title: "Stream Pod logs",
|
|
8398
10074
|
holdsResponse: true,
|
|
8399
10075
|
annotations: readOnly,
|
|
8400
|
-
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
|
|
10076
|
+
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 size cap cut the output. For later container lines, call again with `since` set to the last container line's `ts`; `since` does not replay system lines, so for those request a smaller `tail`.",
|
|
8401
10077
|
inputSchema: {
|
|
8402
10078
|
type: "object",
|
|
8403
10079
|
properties: {
|
|
@@ -8419,10 +10095,10 @@ var streamPodLogs = {
|
|
|
8419
10095
|
var streamWorkerLogs = {
|
|
8420
10096
|
name: "stream-worker-logs",
|
|
8421
10097
|
title: "Stream worker logs",
|
|
8422
|
-
directoryDescription: "Read a bounded snapshot of a Serverless worker's logs (container, system, or both). Holds the live stream open for maxWaitMs and returns the parsed log lines; truncated: true means the
|
|
10098
|
+
directoryDescription: "Read a bounded snapshot of a Serverless worker's logs (container, system, or both). Holds the live stream open for maxWaitMs and returns the parsed log lines; truncated: true means the size cap cut the output. A worker whose container keeps failing to start can report RUNNING or THROTTLED while its logs show the failure.",
|
|
8423
10099
|
holdsResponse: true,
|
|
8424
10100
|
annotations: readOnly,
|
|
8425
|
-
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
|
|
10101
|
+
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 size cap cut the output. For later container lines, call again with `since` set to the last container line's `ts`; `since` does not replay system lines, so for those request a smaller `tail`. 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.",
|
|
8426
10102
|
inputSchema: {
|
|
8427
10103
|
type: "object",
|
|
8428
10104
|
properties: {
|
|
@@ -8568,6 +10244,24 @@ import {
|
|
|
8568
10244
|
loadKnowledge
|
|
8569
10245
|
} from "@runpod/plugin-knowledge";
|
|
8570
10246
|
var knowledge = loadKnowledge();
|
|
10247
|
+
var resolveGuideId = (id) => knowledge.aliases?.[id] ?? id;
|
|
10248
|
+
var hiddenRules = new Set(
|
|
10249
|
+
(process.env.KNOWLEDGE_HIDDEN_RULES ?? "").split(",").map((id) => id.trim()).filter(Boolean)
|
|
10250
|
+
);
|
|
10251
|
+
var concepts = knowledge.concepts.map((concept) => ({
|
|
10252
|
+
...concept,
|
|
10253
|
+
rules: concept.rules.filter((rule) => !hiddenRules.has(rule.id))
|
|
10254
|
+
}));
|
|
10255
|
+
for (const id of hiddenRules) {
|
|
10256
|
+
if (!knowledge.concepts.some(
|
|
10257
|
+
(concept) => concept.rules.some((rule) => rule.id === id)
|
|
10258
|
+
))
|
|
10259
|
+
console.warn("knowledge_hidden_rule_unknown", {
|
|
10260
|
+
id,
|
|
10261
|
+
plugin_version: knowledge.version
|
|
10262
|
+
});
|
|
10263
|
+
}
|
|
10264
|
+
var visibleRuleIds = (ids) => ids.filter((id) => !hiddenRules.has(id));
|
|
8571
10265
|
var GUIDE_KINDS = ["skill", "reference", "golden-path"];
|
|
8572
10266
|
var STOPWORDS = new Set(
|
|
8573
10267
|
"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(
|
|
@@ -8610,7 +10304,7 @@ var guideSummary = ({
|
|
|
8610
10304
|
lanes,
|
|
8611
10305
|
mcp,
|
|
8612
10306
|
needs_shell,
|
|
8613
|
-
concepts
|
|
10307
|
+
concepts: concepts2
|
|
8614
10308
|
}) => ({
|
|
8615
10309
|
id,
|
|
8616
10310
|
kind,
|
|
@@ -8619,7 +10313,7 @@ var guideSummary = ({
|
|
|
8619
10313
|
lanes,
|
|
8620
10314
|
mcp,
|
|
8621
10315
|
needs_shell,
|
|
8622
|
-
concepts
|
|
10316
|
+
concepts: concepts2
|
|
8623
10317
|
});
|
|
8624
10318
|
function linkedGuides(conceptId) {
|
|
8625
10319
|
const byId = new Map(knowledge.guides.map((guide) => [guide.id, guide]));
|
|
@@ -8631,19 +10325,20 @@ function linkedGuides(conceptId) {
|
|
|
8631
10325
|
seen.add(link.from);
|
|
8632
10326
|
const guide = byId.get(link.from);
|
|
8633
10327
|
if (!guide) continue;
|
|
10328
|
+
const rules = link.rules && visibleRuleIds(link.rules);
|
|
8634
10329
|
if (guide.kind === "golden-path")
|
|
8635
10330
|
examples.push({ id: guide.id, title: guide.title, mcp: guide.mcp });
|
|
8636
10331
|
else
|
|
8637
10332
|
docs.push({
|
|
8638
10333
|
id: guide.id,
|
|
8639
10334
|
title: guide.title,
|
|
8640
|
-
...
|
|
10335
|
+
...rules?.length ? { rules } : {}
|
|
8641
10336
|
});
|
|
8642
10337
|
}
|
|
8643
10338
|
return { examples, docs };
|
|
8644
10339
|
}
|
|
8645
10340
|
var conceptIndex = /* @__PURE__ */ new Map();
|
|
8646
|
-
for (const concept of
|
|
10341
|
+
for (const concept of concepts) {
|
|
8647
10342
|
for (const key of [concept.id, concept.name, ...concept.aliases]) {
|
|
8648
10343
|
if (!conceptIndex.has(key.toLowerCase()))
|
|
8649
10344
|
conceptIndex.set(key.toLowerCase(), concept);
|
|
@@ -8677,7 +10372,7 @@ function resolveConcept(input) {
|
|
|
8677
10372
|
return best && !tied ? { concept: best.concept, matchedAs: best.key } : void 0;
|
|
8678
10373
|
}
|
|
8679
10374
|
var ruleIndex = /* @__PURE__ */ new Map();
|
|
8680
|
-
for (const concept of
|
|
10375
|
+
for (const concept of concepts) {
|
|
8681
10376
|
for (const rule of concept.rules) ruleIndex.set(rule.id, { rule, concept });
|
|
8682
10377
|
}
|
|
8683
10378
|
var source = {
|
|
@@ -8726,7 +10421,9 @@ var readGuide = {
|
|
|
8726
10421
|
title: "Read guide",
|
|
8727
10422
|
annotations: bundledRead,
|
|
8728
10423
|
recordedArguments: ["id"],
|
|
8729
|
-
recordedGuideKind: (args) => knowledge.guides.find(
|
|
10424
|
+
recordedGuideKind: (args) => knowledge.guides.find(
|
|
10425
|
+
(guide) => guide.id === resolveGuideId(String(args.id).trim())
|
|
10426
|
+
)?.kind,
|
|
8730
10427
|
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").',
|
|
8731
10428
|
inputSchema: {
|
|
8732
10429
|
type: "object",
|
|
@@ -8738,7 +10435,9 @@ var readGuide = {
|
|
|
8738
10435
|
},
|
|
8739
10436
|
handler: async (_ctx, args) => {
|
|
8740
10437
|
const id = String(args.id).trim();
|
|
8741
|
-
const guide = knowledge.guides.find(
|
|
10438
|
+
const guide = knowledge.guides.find(
|
|
10439
|
+
(candidate) => candidate.id === resolveGuideId(id)
|
|
10440
|
+
);
|
|
8742
10441
|
if (!guide) {
|
|
8743
10442
|
const close = knowledge.guides.filter(
|
|
8744
10443
|
(candidate) => candidate.id.includes(id) || id.includes(candidate.id)
|
|
@@ -8796,7 +10495,7 @@ var lookupConcept = {
|
|
|
8796
10495
|
};
|
|
8797
10496
|
}
|
|
8798
10497
|
const { concept, matchedAs } = resolved;
|
|
8799
|
-
const pointedAtBy =
|
|
10498
|
+
const pointedAtBy = concepts.flatMap((other) => [
|
|
8800
10499
|
...other.is_a === concept.id ? [{ concept: other.id, type: "is_a" }] : [],
|
|
8801
10500
|
...other.part_of === concept.id ? [{ concept: other.id, type: "part_of" }] : [],
|
|
8802
10501
|
...other.relations.filter((relation) => relation.target === concept.id).map((relation) => ({ concept: other.id, type: relation.type }))
|
|
@@ -8810,6 +10509,14 @@ var lookupConcept = {
|
|
|
8810
10509
|
...source,
|
|
8811
10510
|
...matchedAs ? { matched_as: matchedAs } : {},
|
|
8812
10511
|
...concept,
|
|
10512
|
+
steps: concept.steps.map((step) => ({
|
|
10513
|
+
...step,
|
|
10514
|
+
rules: visibleRuleIds(step.rules)
|
|
10515
|
+
})),
|
|
10516
|
+
rules: concept.rules.map((rule) => ({
|
|
10517
|
+
...rule,
|
|
10518
|
+
see: visibleRuleIds(rule.see)
|
|
10519
|
+
})),
|
|
8813
10520
|
pointed_at_by: pointedAtBy,
|
|
8814
10521
|
linked_rules: linkedRules,
|
|
8815
10522
|
...linkedGuides(concept.id)
|
|
@@ -8885,6 +10592,12 @@ var guideResources = knowledge.guides.map((guide) => ({
|
|
|
8885
10592
|
mimeType: "text/markdown",
|
|
8886
10593
|
text: guide.body
|
|
8887
10594
|
}));
|
|
10595
|
+
var findGuideResource = (resources, uri) => {
|
|
10596
|
+
const id = uri.startsWith(GUIDE_URI_PREFIX) ? resolveGuideId(uri.slice(GUIDE_URI_PREFIX.length)) : void 0;
|
|
10597
|
+
return resources.find(
|
|
10598
|
+
(resource) => resource.uri === uri || resource.uri === GUIDE_URI_PREFIX + id
|
|
10599
|
+
);
|
|
10600
|
+
};
|
|
8888
10601
|
|
|
8889
10602
|
// src/specgen/prose.ts
|
|
8890
10603
|
var ABBREVIATIONS = ["e.g.", "i.e.", "etc.", "vs."];
|
|
@@ -9132,6 +10845,7 @@ function captureToolCall(apiKey, event) {
|
|
|
9132
10845
|
server_version: event.serverVersion,
|
|
9133
10846
|
...event.clientName ? { client_name: event.clientName } : {},
|
|
9134
10847
|
...event.guideKind ? { guide_kind: event.guideKind } : {},
|
|
10848
|
+
...event.errorClass ? { error_class: event.errorClass } : {},
|
|
9135
10849
|
...event.blockedBy ? { blocked_by: event.blockedBy } : {},
|
|
9136
10850
|
...event.profile ? { profile: event.profile } : {},
|
|
9137
10851
|
...args
|
|
@@ -9909,7 +11623,7 @@ These tools manage infrastructure only. They do not do SSH sessions, file transf
|
|
|
9909
11623
|
|
|
9910
11624
|
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.
|
|
9911
11625
|
|
|
9912
|
-
PLAYBOOKS \u2014 READ BEFORE ACTING. Each Runpod task has a journey playbook carrying its procedure, pitfalls and report format. Before the FIRST Runpod tool call of a session, load the plugin's runpod-mcp skill if you have it, otherwise read-guide runpod-mcp (also the runpod://guides/runpod-mcp resource): it routes the request to a journey guide \u2014 deploying an endpoint reads serverless-deploy, diagnosing a broken pod reads pod-doctor, cost questions read cost-audit, and so on \u2014 and states the answer contract. A reply produced without the routed playbook loaded is out of contract.
|
|
11626
|
+
PLAYBOOKS \u2014 READ BEFORE ACTING. Each Runpod task has a journey playbook carrying its procedure, pitfalls and report format. Before the FIRST Runpod tool call of a session, load the plugin's runpod-mcp skill if you have it, otherwise read-guide runpod-mcp (also the runpod://guides/runpod-mcp resource): it routes the request to a journey guide \u2014 deploying an endpoint reads runpod-serverless-deploy, diagnosing a broken pod reads runpod-pod-doctor, cost questions read runpod-cost-audit, and so on \u2014 and states the answer contract. A reply produced without the routed playbook loaded is out of contract.
|
|
9913
11627
|
|
|
9914
11628
|
THE OFFICIAL RUNPOD PLUGIN. Runpod ships an agent plugin that also covers the lanes these tools 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, use them for lane choice and for the CLI, image-build and golden-path lanes. For work done with these tools, the journey playbook is the procedure, wherever it is served from: the plugin's runpod-mcp skill and the journey skills it routes to when you have them, otherwise the same playbooks through read-guide here. 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 override any Runpod tool list written down elsewhere, the plugin's skills and guides included.
|
|
9915
11629
|
|
|
@@ -9970,9 +11684,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
9970
11684
|
resourceTemplates: []
|
|
9971
11685
|
}));
|
|
9972
11686
|
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
9973
|
-
const guide = servedGuides.
|
|
9974
|
-
(candidate) => candidate.uri === request.params.uri
|
|
9975
|
-
);
|
|
11687
|
+
const guide = findGuideResource(servedGuides, request.params.uri);
|
|
9976
11688
|
if (opts.analytics) {
|
|
9977
11689
|
captureResourceCall(ctx.apiKey, {
|
|
9978
11690
|
method: "resources/read",
|
|
@@ -10009,6 +11721,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
10009
11721
|
ok: false,
|
|
10010
11722
|
status: 429,
|
|
10011
11723
|
durationMs: 0,
|
|
11724
|
+
errorClass: "rate_limited",
|
|
10012
11725
|
...verdict.reason ? { blockedBy: verdict.reason } : {},
|
|
10013
11726
|
profile,
|
|
10014
11727
|
...opts.analytics
|
|
@@ -10034,6 +11747,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
10034
11747
|
const generated = servedGeneratedTools.find(
|
|
10035
11748
|
(tool) => tool.name === request.params.name
|
|
10036
11749
|
);
|
|
11750
|
+
const curatedArgs = curated ? withoutNullOptionals(curated.inputSchema, args) : args;
|
|
10037
11751
|
const omitted = directory ? directoryOmittedInputs(request.params.name).filter((key) => key in args) : [];
|
|
10038
11752
|
const rejected = omitted.length ? {
|
|
10039
11753
|
ok: false,
|
|
@@ -10043,10 +11757,10 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
10043
11757
|
}
|
|
10044
11758
|
} : curated && !curated.lenientArguments ? validateArguments(
|
|
10045
11759
|
curated.inputSchema,
|
|
10046
|
-
|
|
11760
|
+
curatedArgs
|
|
10047
11761
|
) : null;
|
|
10048
11762
|
const result = rejected ?? await runTool(
|
|
10049
|
-
() => curated ? curated.handler(ctx,
|
|
11763
|
+
() => curated ? curated.handler(ctx, curatedArgs) : dispatchTool(generated, request.params.name, args)
|
|
10050
11764
|
);
|
|
10051
11765
|
logToolCall({
|
|
10052
11766
|
tool: request.params.name,
|
|
@@ -10061,6 +11775,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
10061
11775
|
ok: result.ok,
|
|
10062
11776
|
status: result.status,
|
|
10063
11777
|
durationMs: Date.now() - startedAt,
|
|
11778
|
+
...result.ok ? {} : { errorClass: errorClass(result) },
|
|
10064
11779
|
// The directory profile records which tool ran, never what was asked.
|
|
10065
11780
|
...directory ? {} : {
|
|
10066
11781
|
args: recordedArgumentValues(curated?.recordedArguments, args),
|
|
@@ -10100,24 +11815,50 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
10100
11815
|
var SHAPE_HINT = "Input shape mismatch: check this tool's schema for required fields. For job payloads, the worker's release config defines the expected input object \u2014 fix the payload and retry; don't abandon the task.";
|
|
10101
11816
|
var DETAIL_HINTS = [
|
|
10102
11817
|
[
|
|
10103
|
-
/no longer any instances available|not enough free GPUs/i,
|
|
10104
|
-
"Capacity, not input: the request is valid but no machine can take it right now. Don't change the payload shape. Retry with another GPU type, data center, cloud, CUDA version or count, or try again later. For a stopped Pod, its host's GPUs are taken; that Pod can only start once they free up."
|
|
11818
|
+
/no longer any instances available|no instances currently available|not enough free GPUs/i,
|
|
11819
|
+
"Capacity, not input: the request is valid but no machine can take it right now. Don't change the payload shape. Retry with another GPU type, data center, cloud, CUDA version or count, or try again later. For a stopped Pod, its host's GPUs are taken; that Pod can only start once they free up.",
|
|
11820
|
+
"capacity"
|
|
10105
11821
|
],
|
|
10106
11822
|
[
|
|
10107
11823
|
/at least \$\d|insufficient (?:funds|balance)|\bbalance\b/i,
|
|
10108
|
-
"Account balance, not input: this operation needs funds on the account. Ask the user to add credit in the Runpod console; list-billing shows recent spend."
|
|
11824
|
+
"Account balance, not input: this operation needs funds on the account. Ask the user to add credit in the Runpod console; list-billing shows recent spend.",
|
|
11825
|
+
"balance"
|
|
10109
11826
|
],
|
|
10110
11827
|
[
|
|
10111
11828
|
/mutually exclusive|cannot be combined with/i,
|
|
10112
|
-
"Two arguments conflict: send only one of them and leave the other out entirely. Do not change anything else."
|
|
11829
|
+
"Two arguments conflict: send only one of them and leave the other out entirely. Do not change anything else.",
|
|
11830
|
+
"conflicting_args"
|
|
11831
|
+
],
|
|
11832
|
+
// A 400 with a bare "Unauthorized" detail from a write the same key can
|
|
11833
|
+
// otherwise make is upstream's answer for an unfunded account.
|
|
11834
|
+
[
|
|
11835
|
+
/^\s*unauthorized\s*$/i,
|
|
11836
|
+
"Upstream refused this write. With a key that can read, this usually means the account has no balance: ask the user to check their balance in the Runpod console before retrying.",
|
|
11837
|
+
"balance"
|
|
10113
11838
|
]
|
|
10114
11839
|
];
|
|
11840
|
+
function errorClass(result) {
|
|
11841
|
+
const { status } = result;
|
|
11842
|
+
const payload = asRecord(result.payload) ?? { error: result.payload };
|
|
11843
|
+
const detail = detailText(payload);
|
|
11844
|
+
if (status === 400 && detail) {
|
|
11845
|
+
for (const [pattern, , cls] of DETAIL_HINTS)
|
|
11846
|
+
if (pattern.test(detail)) return cls;
|
|
11847
|
+
}
|
|
11848
|
+
if (status === 400 || status === 422) return "validation";
|
|
11849
|
+
if (status === 401) return "auth";
|
|
11850
|
+
if (status === 402) return "balance";
|
|
11851
|
+
if (status === 403) return "permission";
|
|
11852
|
+
if (status === 404) return "not_found";
|
|
11853
|
+
if (status === 429) return "rate_limited";
|
|
11854
|
+
if (status === 504) return "timeout";
|
|
11855
|
+
if (status >= 500) return "server";
|
|
11856
|
+
return "other";
|
|
11857
|
+
}
|
|
10115
11858
|
function errorHint(status, detail) {
|
|
10116
11859
|
if (status === 400 && detail) {
|
|
10117
11860
|
for (const [pattern, hint] of DETAIL_HINTS)
|
|
10118
11861
|
if (pattern.test(detail)) return hint;
|
|
10119
|
-
if (/^unauthorized$/i.test(detail.trim()))
|
|
10120
|
-
return "Upstream refused this write. With a key that can read, this usually means the account has no balance: ask the user to check their balance in the Runpod console before retrying.";
|
|
10121
11862
|
}
|
|
10122
11863
|
if (status === 400 || status === 422) return SHAPE_HINT;
|
|
10123
11864
|
if (status === 401) return "The Runpod API key is missing or invalid.";
|