@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
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
directoryIncludes,
|
|
10
10
|
directoryOmittedInputs,
|
|
11
11
|
profileForPath
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-FQJFKWUV.mjs";
|
|
13
13
|
|
|
14
14
|
// src/http.ts
|
|
15
15
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
@@ -266,6 +266,14 @@ function validateArguments(inputSchema, args) {
|
|
|
266
266
|
}
|
|
267
267
|
return null;
|
|
268
268
|
}
|
|
269
|
+
function withoutNullOptionals(inputSchema, args) {
|
|
270
|
+
const required = new Set(inputSchema.required ?? []);
|
|
271
|
+
return Object.fromEntries(
|
|
272
|
+
Object.entries(args).filter(
|
|
273
|
+
([name, value]) => value !== null || required.has(name)
|
|
274
|
+
)
|
|
275
|
+
);
|
|
276
|
+
}
|
|
269
277
|
async function dispatchGeneratedTool(client, tool, args) {
|
|
270
278
|
const rejected = validateArguments(tool.inputSchema, args);
|
|
271
279
|
if (rejected) return rejected;
|
|
@@ -390,6 +398,104 @@ function coerceScalars(value, schema, defs, depth = 0) {
|
|
|
390
398
|
|
|
391
399
|
// src/specgen/generated/tools.gen.ts
|
|
392
400
|
var generatedTools = [
|
|
401
|
+
{
|
|
402
|
+
name: "add-organization-group-member",
|
|
403
|
+
title: "Add organization group member",
|
|
404
|
+
operationId: "addOrganizationGroupMember",
|
|
405
|
+
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.",
|
|
406
|
+
method: "PUT",
|
|
407
|
+
path: "/v2/organization/groups/{id}/members/{userId}",
|
|
408
|
+
params: [
|
|
409
|
+
{
|
|
410
|
+
name: "id",
|
|
411
|
+
location: "path"
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
name: "userId",
|
|
415
|
+
location: "path"
|
|
416
|
+
}
|
|
417
|
+
],
|
|
418
|
+
hasBody: false,
|
|
419
|
+
annotations: {
|
|
420
|
+
readOnlyHint: false,
|
|
421
|
+
destructiveHint: false,
|
|
422
|
+
idempotentHint: true,
|
|
423
|
+
openWorldHint: true
|
|
424
|
+
},
|
|
425
|
+
inputSchema: {
|
|
426
|
+
type: "object",
|
|
427
|
+
properties: {
|
|
428
|
+
id: {
|
|
429
|
+
type: "string",
|
|
430
|
+
minLength: 1,
|
|
431
|
+
description: "Group ID."
|
|
432
|
+
},
|
|
433
|
+
userId: {
|
|
434
|
+
type: "string",
|
|
435
|
+
minLength: 1,
|
|
436
|
+
description: "Organization member user ID."
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
required: ["id", "userId"]
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
name: "attach-cost-center-resource",
|
|
444
|
+
title: "Attach cost center resource",
|
|
445
|
+
operationId: "attachCostCenterResource",
|
|
446
|
+
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.",
|
|
447
|
+
method: "PUT",
|
|
448
|
+
path: "/v2/cost-centers/{id}/{resourceType}/{resourceId}",
|
|
449
|
+
params: [
|
|
450
|
+
{
|
|
451
|
+
name: "id",
|
|
452
|
+
location: "path"
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
name: "resourceType",
|
|
456
|
+
location: "path"
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
name: "resourceId",
|
|
460
|
+
location: "path"
|
|
461
|
+
}
|
|
462
|
+
],
|
|
463
|
+
hasBody: false,
|
|
464
|
+
annotations: {
|
|
465
|
+
readOnlyHint: false,
|
|
466
|
+
destructiveHint: false,
|
|
467
|
+
idempotentHint: true,
|
|
468
|
+
openWorldHint: true
|
|
469
|
+
},
|
|
470
|
+
inputSchema: {
|
|
471
|
+
type: "object",
|
|
472
|
+
properties: {
|
|
473
|
+
id: {
|
|
474
|
+
type: "string",
|
|
475
|
+
minLength: 1,
|
|
476
|
+
description: "Cost center identifier."
|
|
477
|
+
},
|
|
478
|
+
resourceType: {
|
|
479
|
+
$ref: "#/$defs/ResourceType",
|
|
480
|
+
description: "Kind of resource.",
|
|
481
|
+
type: "string"
|
|
482
|
+
},
|
|
483
|
+
resourceId: {
|
|
484
|
+
type: "string",
|
|
485
|
+
minLength: 1,
|
|
486
|
+
description: "Resource identifier."
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
required: ["id", "resourceType", "resourceId"],
|
|
490
|
+
$defs: {
|
|
491
|
+
ResourceType: {
|
|
492
|
+
type: "string",
|
|
493
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
494
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
},
|
|
393
499
|
{
|
|
394
500
|
name: "create-cluster",
|
|
395
501
|
title: "Create cluster",
|
|
@@ -488,7 +594,6 @@ var generatedTools = [
|
|
|
488
594
|
},
|
|
489
595
|
network: {
|
|
490
596
|
type: "array",
|
|
491
|
-
maxItems: 1,
|
|
492
597
|
items: {
|
|
493
598
|
$ref: "#/$defs/NetworkMount"
|
|
494
599
|
}
|
|
@@ -510,7 +615,7 @@ var generatedTools = [
|
|
|
510
615
|
gpuCountPerPod: {
|
|
511
616
|
type: "integer",
|
|
512
617
|
minimum: 1,
|
|
513
|
-
description: "Number of GPUs on each pod. Bounded above by the GPU type's per-cloud maximum (GpuType.maxCount);
|
|
618
|
+
description: "Number of GPUs on each pod. Bounded above by the GPU type's per-cloud maximum (GpuType.maxCount); values beyond it are rejected.",
|
|
514
619
|
examples: [8]
|
|
515
620
|
},
|
|
516
621
|
podCount: {
|
|
@@ -523,7 +628,7 @@ var generatedTools = [
|
|
|
523
628
|
}
|
|
524
629
|
},
|
|
525
630
|
ClusterMounts: {
|
|
526
|
-
description: "Storage mounts for a cluster create: `persistent` or `network
|
|
631
|
+
description: "Storage mounts for a cluster create: `persistent` or one `network` volume, not both. Clusters cannot mount global volumes, so `global` is rejected.",
|
|
527
632
|
"x-go-type": "BaseMounts",
|
|
528
633
|
allOf: [
|
|
529
634
|
{
|
|
@@ -543,6 +648,7 @@ var generatedTools = [
|
|
|
543
648
|
},
|
|
544
649
|
network: {
|
|
545
650
|
type: "array",
|
|
651
|
+
maxItems: 1,
|
|
546
652
|
items: {
|
|
547
653
|
type: "object",
|
|
548
654
|
properties: {
|
|
@@ -621,7 +727,7 @@ var generatedTools = [
|
|
|
621
727
|
type: "object",
|
|
622
728
|
required: ["volumeId", "path"],
|
|
623
729
|
additionalProperties: false,
|
|
624
|
-
description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods.
|
|
730
|
+
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`).",
|
|
625
731
|
properties: {
|
|
626
732
|
volumeId: {
|
|
627
733
|
type: "string",
|
|
@@ -644,7 +750,7 @@ var generatedTools = [
|
|
|
644
750
|
size: {
|
|
645
751
|
type: "integer",
|
|
646
752
|
minimum: 10,
|
|
647
|
-
description: "Host-local persistent storage in GB.
|
|
753
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
648
754
|
examples: [20]
|
|
649
755
|
},
|
|
650
756
|
path: {
|
|
@@ -657,6 +763,77 @@ var generatedTools = [
|
|
|
657
763
|
}
|
|
658
764
|
}
|
|
659
765
|
},
|
|
766
|
+
{
|
|
767
|
+
name: "create-cost-center",
|
|
768
|
+
title: "Create cost center",
|
|
769
|
+
operationId: "createCostCenter",
|
|
770
|
+
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.",
|
|
771
|
+
method: "POST",
|
|
772
|
+
path: "/v2/cost-centers",
|
|
773
|
+
params: [],
|
|
774
|
+
hasBody: true,
|
|
775
|
+
annotations: {
|
|
776
|
+
readOnlyHint: false,
|
|
777
|
+
destructiveHint: false,
|
|
778
|
+
idempotentHint: false,
|
|
779
|
+
openWorldHint: true
|
|
780
|
+
},
|
|
781
|
+
inputSchema: {
|
|
782
|
+
type: "object",
|
|
783
|
+
properties: {
|
|
784
|
+
body: {
|
|
785
|
+
$ref: "#/$defs/CreateCostCenterRequest",
|
|
786
|
+
type: "object"
|
|
787
|
+
}
|
|
788
|
+
},
|
|
789
|
+
required: ["body"],
|
|
790
|
+
$defs: {
|
|
791
|
+
CostCenterResource: {
|
|
792
|
+
type: "object",
|
|
793
|
+
additionalProperties: false,
|
|
794
|
+
required: ["id", "type"],
|
|
795
|
+
properties: {
|
|
796
|
+
id: {
|
|
797
|
+
type: "string",
|
|
798
|
+
minLength: 1,
|
|
799
|
+
examples: ["p9k2m4n6q8"]
|
|
800
|
+
},
|
|
801
|
+
type: {
|
|
802
|
+
$ref: "#/$defs/ResourceType"
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
},
|
|
806
|
+
CreateCostCenterRequest: {
|
|
807
|
+
type: "object",
|
|
808
|
+
additionalProperties: false,
|
|
809
|
+
required: ["value"],
|
|
810
|
+
properties: {
|
|
811
|
+
value: {
|
|
812
|
+
type: "string",
|
|
813
|
+
minLength: 1,
|
|
814
|
+
maxLength: 50,
|
|
815
|
+
pattern: "^\\s*\\S",
|
|
816
|
+
description: "Leading and trailing whitespace is trimmed.",
|
|
817
|
+
examples: ["team-ml"]
|
|
818
|
+
},
|
|
819
|
+
resources: {
|
|
820
|
+
type: "array",
|
|
821
|
+
description: "Resources to attribute to the new cost center.",
|
|
822
|
+
maxItems: 100,
|
|
823
|
+
items: {
|
|
824
|
+
$ref: "#/$defs/CostCenterResource"
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
},
|
|
829
|
+
ResourceType: {
|
|
830
|
+
type: "string",
|
|
831
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
832
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
},
|
|
660
837
|
{
|
|
661
838
|
name: "create-delegation",
|
|
662
839
|
title: "Create ECR delegation",
|
|
@@ -1185,6 +1362,7 @@ var generatedTools = [
|
|
|
1185
1362
|
type: "string",
|
|
1186
1363
|
minLength: 1,
|
|
1187
1364
|
maxLength: 191,
|
|
1365
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
1188
1366
|
description: "Human-readable name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed.",
|
|
1189
1367
|
examples: ["training-data"]
|
|
1190
1368
|
}
|
|
@@ -1260,6 +1438,169 @@ var generatedTools = [
|
|
|
1260
1438
|
}
|
|
1261
1439
|
}
|
|
1262
1440
|
},
|
|
1441
|
+
{
|
|
1442
|
+
name: "create-organization-group",
|
|
1443
|
+
title: "Create organization group",
|
|
1444
|
+
operationId: "createOrganizationGroup",
|
|
1445
|
+
description: "Create a group in your current organization",
|
|
1446
|
+
method: "POST",
|
|
1447
|
+
path: "/v2/organization/groups",
|
|
1448
|
+
params: [],
|
|
1449
|
+
hasBody: true,
|
|
1450
|
+
annotations: {
|
|
1451
|
+
readOnlyHint: false,
|
|
1452
|
+
destructiveHint: false,
|
|
1453
|
+
idempotentHint: false,
|
|
1454
|
+
openWorldHint: true
|
|
1455
|
+
},
|
|
1456
|
+
inputSchema: {
|
|
1457
|
+
type: "object",
|
|
1458
|
+
properties: {
|
|
1459
|
+
body: {
|
|
1460
|
+
$ref: "#/$defs/CreateOrganizationGroupRequest",
|
|
1461
|
+
type: "object"
|
|
1462
|
+
}
|
|
1463
|
+
},
|
|
1464
|
+
required: ["body"],
|
|
1465
|
+
$defs: {
|
|
1466
|
+
CreateOrganizationGroupRequest: {
|
|
1467
|
+
type: "object",
|
|
1468
|
+
additionalProperties: false,
|
|
1469
|
+
required: ["name"],
|
|
1470
|
+
properties: {
|
|
1471
|
+
name: {
|
|
1472
|
+
type: "string",
|
|
1473
|
+
minLength: 1,
|
|
1474
|
+
maxLength: 191,
|
|
1475
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
1476
|
+
description: "Group name with at least one non-whitespace character; surrounding whitespace is trimmed.",
|
|
1477
|
+
examples: ["Engineering"]
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
},
|
|
1484
|
+
{
|
|
1485
|
+
name: "create-organization-invite",
|
|
1486
|
+
title: "Create organization invite",
|
|
1487
|
+
operationId: "createOrganizationInvite",
|
|
1488
|
+
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.",
|
|
1489
|
+
method: "POST",
|
|
1490
|
+
path: "/v2/organization/invites",
|
|
1491
|
+
params: [],
|
|
1492
|
+
hasBody: true,
|
|
1493
|
+
annotations: {
|
|
1494
|
+
readOnlyHint: false,
|
|
1495
|
+
destructiveHint: false,
|
|
1496
|
+
idempotentHint: false,
|
|
1497
|
+
openWorldHint: true
|
|
1498
|
+
},
|
|
1499
|
+
inputSchema: {
|
|
1500
|
+
type: "object",
|
|
1501
|
+
properties: {
|
|
1502
|
+
body: {
|
|
1503
|
+
$ref: "#/$defs/CreateOrganizationInviteRequest",
|
|
1504
|
+
type: "object"
|
|
1505
|
+
}
|
|
1506
|
+
},
|
|
1507
|
+
required: ["body"],
|
|
1508
|
+
$defs: {
|
|
1509
|
+
CreateOrganizationInviteRequest: {
|
|
1510
|
+
type: "object",
|
|
1511
|
+
additionalProperties: false,
|
|
1512
|
+
required: ["email", "role"],
|
|
1513
|
+
properties: {
|
|
1514
|
+
email: {
|
|
1515
|
+
type: "string",
|
|
1516
|
+
format: "email",
|
|
1517
|
+
minLength: 1,
|
|
1518
|
+
maxLength: 254,
|
|
1519
|
+
description: "Address to invite, stored lowercased. The invitee accepts by signing in with a verified account on this address.",
|
|
1520
|
+
examples: ["new-member@example.com"]
|
|
1521
|
+
},
|
|
1522
|
+
role: {
|
|
1523
|
+
$ref: "#/$defs/OrganizationRoleInput"
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
},
|
|
1527
|
+
OrganizationRoleInput: {
|
|
1528
|
+
type: "object",
|
|
1529
|
+
description: "An organization role to assign, by ID.",
|
|
1530
|
+
additionalProperties: false,
|
|
1531
|
+
required: ["id"],
|
|
1532
|
+
properties: {
|
|
1533
|
+
id: {
|
|
1534
|
+
type: "string",
|
|
1535
|
+
minLength: 1,
|
|
1536
|
+
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.",
|
|
1537
|
+
examples: ["builtin:dev"]
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
},
|
|
1544
|
+
{
|
|
1545
|
+
name: "create-organization-role",
|
|
1546
|
+
title: "Create organization role",
|
|
1547
|
+
operationId: "createOrganizationRole",
|
|
1548
|
+
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.",
|
|
1549
|
+
method: "POST",
|
|
1550
|
+
path: "/v2/organization/roles",
|
|
1551
|
+
params: [],
|
|
1552
|
+
hasBody: true,
|
|
1553
|
+
annotations: {
|
|
1554
|
+
readOnlyHint: false,
|
|
1555
|
+
destructiveHint: false,
|
|
1556
|
+
idempotentHint: false,
|
|
1557
|
+
openWorldHint: true
|
|
1558
|
+
},
|
|
1559
|
+
inputSchema: {
|
|
1560
|
+
type: "object",
|
|
1561
|
+
properties: {
|
|
1562
|
+
body: {
|
|
1563
|
+
$ref: "#/$defs/CreateOrganizationRoleRequest",
|
|
1564
|
+
type: "object"
|
|
1565
|
+
}
|
|
1566
|
+
},
|
|
1567
|
+
required: ["body"],
|
|
1568
|
+
$defs: {
|
|
1569
|
+
CreateOrganizationRoleRequest: {
|
|
1570
|
+
type: "object",
|
|
1571
|
+
additionalProperties: false,
|
|
1572
|
+
required: ["name", "capabilities"],
|
|
1573
|
+
properties: {
|
|
1574
|
+
name: {
|
|
1575
|
+
$ref: "#/$defs/OrganizationRoleName"
|
|
1576
|
+
},
|
|
1577
|
+
capabilities: {
|
|
1578
|
+
$ref: "#/$defs/OrganizationRoleCapabilitiesInput"
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
},
|
|
1582
|
+
OrganizationRoleCapabilitiesInput: {
|
|
1583
|
+
type: "array",
|
|
1584
|
+
description: "What the role grants, as `FAMILY:VERB` capabilities from `get-organization-role-capabilities`. The caller must hold every capability it lists.",
|
|
1585
|
+
minItems: 1,
|
|
1586
|
+
uniqueItems: true,
|
|
1587
|
+
items: {
|
|
1588
|
+
type: "string",
|
|
1589
|
+
pattern: "^[A-Z0-9_]+:[A-Z0-9_]+$"
|
|
1590
|
+
},
|
|
1591
|
+
examples: [["POD:VIEW"]]
|
|
1592
|
+
},
|
|
1593
|
+
OrganizationRoleName: {
|
|
1594
|
+
type: "string",
|
|
1595
|
+
minLength: 1,
|
|
1596
|
+
maxLength: 191,
|
|
1597
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
1598
|
+
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.",
|
|
1599
|
+
examples: ["Pod viewer"]
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
},
|
|
1263
1604
|
{
|
|
1264
1605
|
name: "create-pod",
|
|
1265
1606
|
title: "Create Pod",
|
|
@@ -1380,6 +1721,7 @@ var generatedTools = [
|
|
|
1380
1721
|
count: {
|
|
1381
1722
|
type: "integer",
|
|
1382
1723
|
minimum: 1,
|
|
1724
|
+
maximum: 1024,
|
|
1383
1725
|
default: 1,
|
|
1384
1726
|
description: "Number of GPUs",
|
|
1385
1727
|
examples: [1]
|
|
@@ -1394,7 +1736,6 @@ var generatedTools = [
|
|
|
1394
1736
|
},
|
|
1395
1737
|
network: {
|
|
1396
1738
|
type: "array",
|
|
1397
|
-
maxItems: 1,
|
|
1398
1739
|
items: {
|
|
1399
1740
|
$ref: "#/$defs/NetworkMount"
|
|
1400
1741
|
}
|
|
@@ -1458,12 +1799,14 @@ var generatedTools = [
|
|
|
1458
1799
|
minRamPerGpu: {
|
|
1459
1800
|
type: "integer",
|
|
1460
1801
|
minimum: 1,
|
|
1802
|
+
maximum: 65536,
|
|
1461
1803
|
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.",
|
|
1462
1804
|
examples: [8]
|
|
1463
1805
|
},
|
|
1464
1806
|
minVcpuCountPerGpu: {
|
|
1465
1807
|
type: "integer",
|
|
1466
1808
|
minimum: 1,
|
|
1809
|
+
maximum: 4096,
|
|
1467
1810
|
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.",
|
|
1468
1811
|
examples: [2]
|
|
1469
1812
|
}
|
|
@@ -1554,7 +1897,7 @@ var generatedTools = [
|
|
|
1554
1897
|
type: "object",
|
|
1555
1898
|
required: ["volumeId"],
|
|
1556
1899
|
additionalProperties: false,
|
|
1557
|
-
description: "Reference to a GlobalVolume. Usage-billed, so it has no size.
|
|
1900
|
+
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`).",
|
|
1558
1901
|
properties: {
|
|
1559
1902
|
volumeId: {
|
|
1560
1903
|
type: "string",
|
|
@@ -1563,7 +1906,7 @@ var generatedTools = [
|
|
|
1563
1906
|
},
|
|
1564
1907
|
path: {
|
|
1565
1908
|
type: "string",
|
|
1566
|
-
description: "Mount path inside the container. Optional
|
|
1909
|
+
description: "Mount path inside the container. Optional; a default is chosen for you when omitted.",
|
|
1567
1910
|
examples: ["/data"]
|
|
1568
1911
|
}
|
|
1569
1912
|
}
|
|
@@ -1577,10 +1920,18 @@ var generatedTools = [
|
|
|
1577
1920
|
{
|
|
1578
1921
|
type: "object",
|
|
1579
1922
|
properties: {
|
|
1923
|
+
network: {
|
|
1924
|
+
type: "array",
|
|
1925
|
+
maxItems: 4,
|
|
1926
|
+
description: "Up to 4 network volumes, all in the pod's data center.",
|
|
1927
|
+
items: {
|
|
1928
|
+
$ref: "#/$defs/NetworkMount"
|
|
1929
|
+
}
|
|
1930
|
+
},
|
|
1580
1931
|
global: {
|
|
1581
1932
|
type: "array",
|
|
1582
1933
|
maxItems: 1,
|
|
1583
|
-
description: "At most one global volume, on GPU and CPU pods, with no data center constraint. Combinable with `network` but not with `persistent` (rejected):
|
|
1934
|
+
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`.",
|
|
1584
1935
|
items: {
|
|
1585
1936
|
$ref: "#/$defs/GlobalMount"
|
|
1586
1937
|
}
|
|
@@ -1594,7 +1945,7 @@ var generatedTools = [
|
|
|
1594
1945
|
type: "object",
|
|
1595
1946
|
required: ["volumeId", "path"],
|
|
1596
1947
|
additionalProperties: false,
|
|
1597
|
-
description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods.
|
|
1948
|
+
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`).",
|
|
1598
1949
|
properties: {
|
|
1599
1950
|
volumeId: {
|
|
1600
1951
|
type: "string",
|
|
@@ -1617,7 +1968,7 @@ var generatedTools = [
|
|
|
1617
1968
|
size: {
|
|
1618
1969
|
type: "integer",
|
|
1619
1970
|
minimum: 10,
|
|
1620
|
-
description: "Host-local persistent storage in GB.
|
|
1971
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
1621
1972
|
examples: [20]
|
|
1622
1973
|
},
|
|
1623
1974
|
path: {
|
|
@@ -1914,7 +2265,7 @@ var generatedTools = [
|
|
|
1914
2265
|
size: {
|
|
1915
2266
|
type: "integer",
|
|
1916
2267
|
minimum: 10,
|
|
1917
|
-
description: "Host-local persistent storage in GB.
|
|
2268
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
1918
2269
|
examples: [20]
|
|
1919
2270
|
},
|
|
1920
2271
|
path: {
|
|
@@ -1975,13 +2326,12 @@ var generatedTools = [
|
|
|
1975
2326
|
}
|
|
1976
2327
|
},
|
|
1977
2328
|
{
|
|
1978
|
-
name: "delete-
|
|
1979
|
-
title: "Delete
|
|
1980
|
-
operationId: "
|
|
1981
|
-
description: "Delete a
|
|
1982
|
-
directoryDescription: "Delete a Serverless endpoint permanently and immediately.",
|
|
2329
|
+
name: "delete-cost-center",
|
|
2330
|
+
title: "Delete cost center",
|
|
2331
|
+
operationId: "deleteCostCenter",
|
|
2332
|
+
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.",
|
|
1983
2333
|
method: "DELETE",
|
|
1984
|
-
path: "/v2/
|
|
2334
|
+
path: "/v2/cost-centers/{id}",
|
|
1985
2335
|
params: [
|
|
1986
2336
|
{
|
|
1987
2337
|
name: "id",
|
|
@@ -2000,17 +2350,50 @@ var generatedTools = [
|
|
|
2000
2350
|
properties: {
|
|
2001
2351
|
id: {
|
|
2002
2352
|
type: "string",
|
|
2003
|
-
|
|
2353
|
+
minLength: 1,
|
|
2354
|
+
description: "Cost center identifier."
|
|
2004
2355
|
}
|
|
2005
2356
|
},
|
|
2006
2357
|
required: ["id"]
|
|
2007
2358
|
}
|
|
2008
2359
|
},
|
|
2009
2360
|
{
|
|
2010
|
-
name: "delete-
|
|
2011
|
-
title: "Delete
|
|
2012
|
-
operationId: "
|
|
2013
|
-
description: "Delete a
|
|
2361
|
+
name: "delete-endpoint",
|
|
2362
|
+
title: "Delete endpoint",
|
|
2363
|
+
operationId: "deleteEndpoint",
|
|
2364
|
+
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.",
|
|
2365
|
+
directoryDescription: "Delete a Serverless endpoint permanently and immediately.",
|
|
2366
|
+
method: "DELETE",
|
|
2367
|
+
path: "/v2/serverless/{id}",
|
|
2368
|
+
params: [
|
|
2369
|
+
{
|
|
2370
|
+
name: "id",
|
|
2371
|
+
location: "path"
|
|
2372
|
+
}
|
|
2373
|
+
],
|
|
2374
|
+
hasBody: false,
|
|
2375
|
+
annotations: {
|
|
2376
|
+
readOnlyHint: false,
|
|
2377
|
+
destructiveHint: true,
|
|
2378
|
+
idempotentHint: true,
|
|
2379
|
+
openWorldHint: true
|
|
2380
|
+
},
|
|
2381
|
+
inputSchema: {
|
|
2382
|
+
type: "object",
|
|
2383
|
+
properties: {
|
|
2384
|
+
id: {
|
|
2385
|
+
type: "string",
|
|
2386
|
+
description: "Serverless endpoint identifier"
|
|
2387
|
+
}
|
|
2388
|
+
},
|
|
2389
|
+
required: ["id"]
|
|
2390
|
+
}
|
|
2391
|
+
},
|
|
2392
|
+
{
|
|
2393
|
+
name: "delete-global-volume",
|
|
2394
|
+
title: "Delete global volume",
|
|
2395
|
+
operationId: "deleteGlobalVolume",
|
|
2396
|
+
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.",
|
|
2014
2397
|
method: "DELETE",
|
|
2015
2398
|
path: "/v2/global-volumes/{id}",
|
|
2016
2399
|
params: [
|
|
@@ -2068,6 +2451,131 @@ var generatedTools = [
|
|
|
2068
2451
|
required: ["id"]
|
|
2069
2452
|
}
|
|
2070
2453
|
},
|
|
2454
|
+
{
|
|
2455
|
+
name: "delete-organization-group",
|
|
2456
|
+
title: "Delete organization group",
|
|
2457
|
+
operationId: "deleteOrganizationGroup",
|
|
2458
|
+
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.",
|
|
2459
|
+
method: "DELETE",
|
|
2460
|
+
path: "/v2/organization/groups/{id}",
|
|
2461
|
+
params: [
|
|
2462
|
+
{
|
|
2463
|
+
name: "id",
|
|
2464
|
+
location: "path"
|
|
2465
|
+
}
|
|
2466
|
+
],
|
|
2467
|
+
hasBody: false,
|
|
2468
|
+
annotations: {
|
|
2469
|
+
readOnlyHint: false,
|
|
2470
|
+
destructiveHint: true,
|
|
2471
|
+
idempotentHint: true,
|
|
2472
|
+
openWorldHint: true
|
|
2473
|
+
},
|
|
2474
|
+
inputSchema: {
|
|
2475
|
+
type: "object",
|
|
2476
|
+
properties: {
|
|
2477
|
+
id: {
|
|
2478
|
+
type: "string",
|
|
2479
|
+
minLength: 1,
|
|
2480
|
+
description: "Group ID."
|
|
2481
|
+
}
|
|
2482
|
+
},
|
|
2483
|
+
required: ["id"]
|
|
2484
|
+
}
|
|
2485
|
+
},
|
|
2486
|
+
{
|
|
2487
|
+
name: "delete-organization-invite",
|
|
2488
|
+
title: "Delete organization invite",
|
|
2489
|
+
operationId: "deleteOrganizationInvite",
|
|
2490
|
+
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.",
|
|
2491
|
+
method: "DELETE",
|
|
2492
|
+
path: "/v2/organization/invites/{id}",
|
|
2493
|
+
params: [
|
|
2494
|
+
{
|
|
2495
|
+
name: "id",
|
|
2496
|
+
location: "path"
|
|
2497
|
+
}
|
|
2498
|
+
],
|
|
2499
|
+
hasBody: false,
|
|
2500
|
+
annotations: {
|
|
2501
|
+
readOnlyHint: false,
|
|
2502
|
+
destructiveHint: true,
|
|
2503
|
+
idempotentHint: true,
|
|
2504
|
+
openWorldHint: true
|
|
2505
|
+
},
|
|
2506
|
+
inputSchema: {
|
|
2507
|
+
type: "object",
|
|
2508
|
+
properties: {
|
|
2509
|
+
id: {
|
|
2510
|
+
type: "string",
|
|
2511
|
+
description: "Invite identifier"
|
|
2512
|
+
}
|
|
2513
|
+
},
|
|
2514
|
+
required: ["id"]
|
|
2515
|
+
}
|
|
2516
|
+
},
|
|
2517
|
+
{
|
|
2518
|
+
name: "delete-organization-role",
|
|
2519
|
+
title: "Delete organization role",
|
|
2520
|
+
operationId: "deleteOrganizationRole",
|
|
2521
|
+
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.",
|
|
2522
|
+
method: "DELETE",
|
|
2523
|
+
path: "/v2/organization/roles/{id}",
|
|
2524
|
+
params: [
|
|
2525
|
+
{
|
|
2526
|
+
name: "id",
|
|
2527
|
+
location: "path"
|
|
2528
|
+
}
|
|
2529
|
+
],
|
|
2530
|
+
hasBody: false,
|
|
2531
|
+
annotations: {
|
|
2532
|
+
readOnlyHint: false,
|
|
2533
|
+
destructiveHint: true,
|
|
2534
|
+
idempotentHint: true,
|
|
2535
|
+
openWorldHint: true
|
|
2536
|
+
},
|
|
2537
|
+
inputSchema: {
|
|
2538
|
+
type: "object",
|
|
2539
|
+
properties: {
|
|
2540
|
+
id: {
|
|
2541
|
+
type: "string",
|
|
2542
|
+
description: "Role identifier"
|
|
2543
|
+
}
|
|
2544
|
+
},
|
|
2545
|
+
required: ["id"]
|
|
2546
|
+
}
|
|
2547
|
+
},
|
|
2548
|
+
{
|
|
2549
|
+
name: "delete-organization-user",
|
|
2550
|
+
title: "Delete organization user",
|
|
2551
|
+
operationId: "deleteOrganizationUser",
|
|
2552
|
+
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.",
|
|
2553
|
+
method: "DELETE",
|
|
2554
|
+
path: "/v2/organization/users/{id}",
|
|
2555
|
+
params: [
|
|
2556
|
+
{
|
|
2557
|
+
name: "id",
|
|
2558
|
+
location: "path"
|
|
2559
|
+
}
|
|
2560
|
+
],
|
|
2561
|
+
hasBody: false,
|
|
2562
|
+
annotations: {
|
|
2563
|
+
readOnlyHint: false,
|
|
2564
|
+
destructiveHint: true,
|
|
2565
|
+
idempotentHint: true,
|
|
2566
|
+
openWorldHint: true
|
|
2567
|
+
},
|
|
2568
|
+
inputSchema: {
|
|
2569
|
+
type: "object",
|
|
2570
|
+
properties: {
|
|
2571
|
+
id: {
|
|
2572
|
+
type: "string",
|
|
2573
|
+
description: "User identifier"
|
|
2574
|
+
}
|
|
2575
|
+
},
|
|
2576
|
+
required: ["id"]
|
|
2577
|
+
}
|
|
2578
|
+
},
|
|
2071
2579
|
{
|
|
2072
2580
|
name: "delete-pod",
|
|
2073
2581
|
title: "Delete Pod",
|
|
@@ -2193,6 +2701,63 @@ var generatedTools = [
|
|
|
2193
2701
|
required: ["id"]
|
|
2194
2702
|
}
|
|
2195
2703
|
},
|
|
2704
|
+
{
|
|
2705
|
+
name: "detach-cost-center-resource",
|
|
2706
|
+
title: "Detach cost center resource",
|
|
2707
|
+
operationId: "detachCostCenterResource",
|
|
2708
|
+
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.",
|
|
2709
|
+
method: "DELETE",
|
|
2710
|
+
path: "/v2/cost-centers/{id}/{resourceType}/{resourceId}",
|
|
2711
|
+
params: [
|
|
2712
|
+
{
|
|
2713
|
+
name: "id",
|
|
2714
|
+
location: "path"
|
|
2715
|
+
},
|
|
2716
|
+
{
|
|
2717
|
+
name: "resourceType",
|
|
2718
|
+
location: "path"
|
|
2719
|
+
},
|
|
2720
|
+
{
|
|
2721
|
+
name: "resourceId",
|
|
2722
|
+
location: "path"
|
|
2723
|
+
}
|
|
2724
|
+
],
|
|
2725
|
+
hasBody: false,
|
|
2726
|
+
annotations: {
|
|
2727
|
+
readOnlyHint: false,
|
|
2728
|
+
destructiveHint: true,
|
|
2729
|
+
idempotentHint: true,
|
|
2730
|
+
openWorldHint: true
|
|
2731
|
+
},
|
|
2732
|
+
inputSchema: {
|
|
2733
|
+
type: "object",
|
|
2734
|
+
properties: {
|
|
2735
|
+
id: {
|
|
2736
|
+
type: "string",
|
|
2737
|
+
minLength: 1,
|
|
2738
|
+
description: "Cost center identifier."
|
|
2739
|
+
},
|
|
2740
|
+
resourceType: {
|
|
2741
|
+
$ref: "#/$defs/ResourceType",
|
|
2742
|
+
description: "Kind of resource.",
|
|
2743
|
+
type: "string"
|
|
2744
|
+
},
|
|
2745
|
+
resourceId: {
|
|
2746
|
+
type: "string",
|
|
2747
|
+
minLength: 1,
|
|
2748
|
+
description: "Resource identifier."
|
|
2749
|
+
}
|
|
2750
|
+
},
|
|
2751
|
+
required: ["id", "resourceType", "resourceId"],
|
|
2752
|
+
$defs: {
|
|
2753
|
+
ResourceType: {
|
|
2754
|
+
type: "string",
|
|
2755
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
2756
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
2757
|
+
}
|
|
2758
|
+
}
|
|
2759
|
+
}
|
|
2760
|
+
},
|
|
2196
2761
|
{
|
|
2197
2762
|
name: "get-cluster",
|
|
2198
2763
|
title: "Get cluster",
|
|
@@ -2224,6 +2789,38 @@ var generatedTools = [
|
|
|
2224
2789
|
required: ["id"]
|
|
2225
2790
|
}
|
|
2226
2791
|
},
|
|
2792
|
+
{
|
|
2793
|
+
name: "get-cost-center",
|
|
2794
|
+
title: "Get cost center",
|
|
2795
|
+
operationId: "getCostCenter",
|
|
2796
|
+
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.",
|
|
2797
|
+
method: "GET",
|
|
2798
|
+
path: "/v2/cost-centers/{id}",
|
|
2799
|
+
params: [
|
|
2800
|
+
{
|
|
2801
|
+
name: "id",
|
|
2802
|
+
location: "path"
|
|
2803
|
+
}
|
|
2804
|
+
],
|
|
2805
|
+
hasBody: false,
|
|
2806
|
+
annotations: {
|
|
2807
|
+
readOnlyHint: true,
|
|
2808
|
+
destructiveHint: false,
|
|
2809
|
+
idempotentHint: true,
|
|
2810
|
+
openWorldHint: true
|
|
2811
|
+
},
|
|
2812
|
+
inputSchema: {
|
|
2813
|
+
type: "object",
|
|
2814
|
+
properties: {
|
|
2815
|
+
id: {
|
|
2816
|
+
type: "string",
|
|
2817
|
+
minLength: 1,
|
|
2818
|
+
description: "Cost center identifier."
|
|
2819
|
+
}
|
|
2820
|
+
},
|
|
2821
|
+
required: ["id"]
|
|
2822
|
+
}
|
|
2823
|
+
},
|
|
2227
2824
|
{
|
|
2228
2825
|
name: "get-cpu-type",
|
|
2229
2826
|
title: "Get CPU type",
|
|
@@ -2421,6 +3018,261 @@ var generatedTools = [
|
|
|
2421
3018
|
required: ["id", "buildId"]
|
|
2422
3019
|
}
|
|
2423
3020
|
},
|
|
3021
|
+
{
|
|
3022
|
+
name: "get-endpoint-cold-start-metrics",
|
|
3023
|
+
title: "Get endpoint cold start metrics",
|
|
3024
|
+
operationId: "getEndpointColdStartMetrics",
|
|
3025
|
+
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.",
|
|
3026
|
+
method: "GET",
|
|
3027
|
+
path: "/v2/serverless/{id}/metrics/cold-starts",
|
|
3028
|
+
params: [
|
|
3029
|
+
{
|
|
3030
|
+
name: "id",
|
|
3031
|
+
location: "path"
|
|
3032
|
+
},
|
|
3033
|
+
{
|
|
3034
|
+
name: "startTime",
|
|
3035
|
+
location: "query"
|
|
3036
|
+
},
|
|
3037
|
+
{
|
|
3038
|
+
name: "endTime",
|
|
3039
|
+
location: "query"
|
|
3040
|
+
},
|
|
3041
|
+
{
|
|
3042
|
+
name: "interval",
|
|
3043
|
+
location: "query"
|
|
3044
|
+
},
|
|
3045
|
+
{
|
|
3046
|
+
name: "cursor",
|
|
3047
|
+
location: "query"
|
|
3048
|
+
},
|
|
3049
|
+
{
|
|
3050
|
+
name: "limit",
|
|
3051
|
+
location: "query"
|
|
3052
|
+
}
|
|
3053
|
+
],
|
|
3054
|
+
hasBody: false,
|
|
3055
|
+
annotations: {
|
|
3056
|
+
readOnlyHint: true,
|
|
3057
|
+
destructiveHint: false,
|
|
3058
|
+
idempotentHint: true,
|
|
3059
|
+
openWorldHint: true
|
|
3060
|
+
},
|
|
3061
|
+
inputSchema: {
|
|
3062
|
+
type: "object",
|
|
3063
|
+
properties: {
|
|
3064
|
+
id: {
|
|
3065
|
+
type: "string",
|
|
3066
|
+
description: "Serverless endpoint identifier"
|
|
3067
|
+
},
|
|
3068
|
+
startTime: {
|
|
3069
|
+
type: "string",
|
|
3070
|
+
format: "date-time",
|
|
3071
|
+
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."
|
|
3072
|
+
},
|
|
3073
|
+
endTime: {
|
|
3074
|
+
type: "string",
|
|
3075
|
+
format: "date-time",
|
|
3076
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
3077
|
+
},
|
|
3078
|
+
interval: {
|
|
3079
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
3080
|
+
description: "Bucket size. Defaults to 1h.",
|
|
3081
|
+
type: "string"
|
|
3082
|
+
},
|
|
3083
|
+
cursor: {
|
|
3084
|
+
type: "string",
|
|
3085
|
+
minLength: 1,
|
|
3086
|
+
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."
|
|
3087
|
+
},
|
|
3088
|
+
limit: {
|
|
3089
|
+
type: "integer",
|
|
3090
|
+
minimum: 1,
|
|
3091
|
+
maximum: 1e3,
|
|
3092
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
3093
|
+
}
|
|
3094
|
+
},
|
|
3095
|
+
required: ["id"],
|
|
3096
|
+
$defs: {
|
|
3097
|
+
EndpointMetricsInterval: {
|
|
3098
|
+
type: "string",
|
|
3099
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
3100
|
+
default: "1h",
|
|
3101
|
+
description: "Bucket size for endpoint metrics."
|
|
3102
|
+
}
|
|
3103
|
+
}
|
|
3104
|
+
}
|
|
3105
|
+
},
|
|
3106
|
+
{
|
|
3107
|
+
name: "get-endpoint-request-metrics",
|
|
3108
|
+
title: "Get endpoint request metrics",
|
|
3109
|
+
operationId: "getEndpointRequestMetrics",
|
|
3110
|
+
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.",
|
|
3111
|
+
method: "GET",
|
|
3112
|
+
path: "/v2/serverless/{id}/metrics/requests",
|
|
3113
|
+
params: [
|
|
3114
|
+
{
|
|
3115
|
+
name: "id",
|
|
3116
|
+
location: "path"
|
|
3117
|
+
},
|
|
3118
|
+
{
|
|
3119
|
+
name: "startTime",
|
|
3120
|
+
location: "query"
|
|
3121
|
+
},
|
|
3122
|
+
{
|
|
3123
|
+
name: "endTime",
|
|
3124
|
+
location: "query"
|
|
3125
|
+
},
|
|
3126
|
+
{
|
|
3127
|
+
name: "interval",
|
|
3128
|
+
location: "query"
|
|
3129
|
+
},
|
|
3130
|
+
{
|
|
3131
|
+
name: "cursor",
|
|
3132
|
+
location: "query"
|
|
3133
|
+
},
|
|
3134
|
+
{
|
|
3135
|
+
name: "limit",
|
|
3136
|
+
location: "query"
|
|
3137
|
+
}
|
|
3138
|
+
],
|
|
3139
|
+
hasBody: false,
|
|
3140
|
+
annotations: {
|
|
3141
|
+
readOnlyHint: true,
|
|
3142
|
+
destructiveHint: false,
|
|
3143
|
+
idempotentHint: true,
|
|
3144
|
+
openWorldHint: true
|
|
3145
|
+
},
|
|
3146
|
+
inputSchema: {
|
|
3147
|
+
type: "object",
|
|
3148
|
+
properties: {
|
|
3149
|
+
id: {
|
|
3150
|
+
type: "string",
|
|
3151
|
+
description: "Serverless endpoint identifier"
|
|
3152
|
+
},
|
|
3153
|
+
startTime: {
|
|
3154
|
+
type: "string",
|
|
3155
|
+
format: "date-time",
|
|
3156
|
+
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."
|
|
3157
|
+
},
|
|
3158
|
+
endTime: {
|
|
3159
|
+
type: "string",
|
|
3160
|
+
format: "date-time",
|
|
3161
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
3162
|
+
},
|
|
3163
|
+
interval: {
|
|
3164
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
3165
|
+
description: "Bucket size. Defaults to 1h.",
|
|
3166
|
+
type: "string"
|
|
3167
|
+
},
|
|
3168
|
+
cursor: {
|
|
3169
|
+
type: "string",
|
|
3170
|
+
minLength: 1,
|
|
3171
|
+
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."
|
|
3172
|
+
},
|
|
3173
|
+
limit: {
|
|
3174
|
+
type: "integer",
|
|
3175
|
+
minimum: 1,
|
|
3176
|
+
maximum: 1e3,
|
|
3177
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
3178
|
+
}
|
|
3179
|
+
},
|
|
3180
|
+
required: ["id"],
|
|
3181
|
+
$defs: {
|
|
3182
|
+
EndpointMetricsInterval: {
|
|
3183
|
+
type: "string",
|
|
3184
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
3185
|
+
default: "1h",
|
|
3186
|
+
description: "Bucket size for endpoint metrics."
|
|
3187
|
+
}
|
|
3188
|
+
}
|
|
3189
|
+
}
|
|
3190
|
+
},
|
|
3191
|
+
{
|
|
3192
|
+
name: "get-endpoint-worker-metrics",
|
|
3193
|
+
title: "Get endpoint worker metrics",
|
|
3194
|
+
operationId: "getEndpointWorkerMetrics",
|
|
3195
|
+
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.",
|
|
3196
|
+
method: "GET",
|
|
3197
|
+
path: "/v2/serverless/{id}/metrics/workers",
|
|
3198
|
+
params: [
|
|
3199
|
+
{
|
|
3200
|
+
name: "id",
|
|
3201
|
+
location: "path"
|
|
3202
|
+
},
|
|
3203
|
+
{
|
|
3204
|
+
name: "startTime",
|
|
3205
|
+
location: "query"
|
|
3206
|
+
},
|
|
3207
|
+
{
|
|
3208
|
+
name: "endTime",
|
|
3209
|
+
location: "query"
|
|
3210
|
+
},
|
|
3211
|
+
{
|
|
3212
|
+
name: "interval",
|
|
3213
|
+
location: "query"
|
|
3214
|
+
},
|
|
3215
|
+
{
|
|
3216
|
+
name: "cursor",
|
|
3217
|
+
location: "query"
|
|
3218
|
+
},
|
|
3219
|
+
{
|
|
3220
|
+
name: "limit",
|
|
3221
|
+
location: "query"
|
|
3222
|
+
}
|
|
3223
|
+
],
|
|
3224
|
+
hasBody: false,
|
|
3225
|
+
annotations: {
|
|
3226
|
+
readOnlyHint: true,
|
|
3227
|
+
destructiveHint: false,
|
|
3228
|
+
idempotentHint: true,
|
|
3229
|
+
openWorldHint: true
|
|
3230
|
+
},
|
|
3231
|
+
inputSchema: {
|
|
3232
|
+
type: "object",
|
|
3233
|
+
properties: {
|
|
3234
|
+
id: {
|
|
3235
|
+
type: "string",
|
|
3236
|
+
description: "Serverless endpoint identifier"
|
|
3237
|
+
},
|
|
3238
|
+
startTime: {
|
|
3239
|
+
type: "string",
|
|
3240
|
+
format: "date-time",
|
|
3241
|
+
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."
|
|
3242
|
+
},
|
|
3243
|
+
endTime: {
|
|
3244
|
+
type: "string",
|
|
3245
|
+
format: "date-time",
|
|
3246
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
3247
|
+
},
|
|
3248
|
+
interval: {
|
|
3249
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
3250
|
+
description: "Bucket size. Defaults to 1h.",
|
|
3251
|
+
type: "string"
|
|
3252
|
+
},
|
|
3253
|
+
cursor: {
|
|
3254
|
+
type: "string",
|
|
3255
|
+
minLength: 1,
|
|
3256
|
+
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."
|
|
3257
|
+
},
|
|
3258
|
+
limit: {
|
|
3259
|
+
type: "integer",
|
|
3260
|
+
minimum: 1,
|
|
3261
|
+
maximum: 1e3,
|
|
3262
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
3263
|
+
}
|
|
3264
|
+
},
|
|
3265
|
+
required: ["id"],
|
|
3266
|
+
$defs: {
|
|
3267
|
+
EndpointMetricsInterval: {
|
|
3268
|
+
type: "string",
|
|
3269
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
3270
|
+
default: "1h",
|
|
3271
|
+
description: "Bucket size for endpoint metrics."
|
|
3272
|
+
}
|
|
3273
|
+
}
|
|
3274
|
+
}
|
|
3275
|
+
},
|
|
2424
3276
|
{
|
|
2425
3277
|
name: "get-global-volume",
|
|
2426
3278
|
title: "Get global volume",
|
|
@@ -2533,7 +3385,7 @@ var generatedTools = [
|
|
|
2533
3385
|
},
|
|
2534
3386
|
cloud: {
|
|
2535
3387
|
$ref: "#/$defs/GpuCloudFilter",
|
|
2536
|
-
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY.
|
|
3388
|
+
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Default when omitted: SECURE.",
|
|
2537
3389
|
type: "string"
|
|
2538
3390
|
},
|
|
2539
3391
|
countryCodes: {
|
|
@@ -2572,19 +3424,133 @@ var generatedTools = [
|
|
|
2572
3424
|
},
|
|
2573
3425
|
Product: {
|
|
2574
3426
|
type: "string",
|
|
2575
|
-
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
2576
|
-
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
3427
|
+
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
3428
|
+
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
3429
|
+
}
|
|
3430
|
+
}
|
|
3431
|
+
}
|
|
3432
|
+
},
|
|
3433
|
+
{
|
|
3434
|
+
name: "get-network-volume",
|
|
3435
|
+
title: "Get network volume",
|
|
3436
|
+
operationId: "getNetworkVolume",
|
|
3437
|
+
description: "Get a network volume. Returns a single network volume by ID.",
|
|
3438
|
+
method: "GET",
|
|
3439
|
+
path: "/v2/network-volumes/{id}",
|
|
3440
|
+
params: [
|
|
3441
|
+
{
|
|
3442
|
+
name: "id",
|
|
3443
|
+
location: "path"
|
|
3444
|
+
}
|
|
3445
|
+
],
|
|
3446
|
+
hasBody: false,
|
|
3447
|
+
annotations: {
|
|
3448
|
+
readOnlyHint: true,
|
|
3449
|
+
destructiveHint: false,
|
|
3450
|
+
idempotentHint: true,
|
|
3451
|
+
openWorldHint: true
|
|
3452
|
+
},
|
|
3453
|
+
inputSchema: {
|
|
3454
|
+
type: "object",
|
|
3455
|
+
properties: {
|
|
3456
|
+
id: {
|
|
3457
|
+
type: "string",
|
|
3458
|
+
description: "Network volume identifier"
|
|
3459
|
+
}
|
|
3460
|
+
},
|
|
3461
|
+
required: ["id"]
|
|
3462
|
+
}
|
|
3463
|
+
},
|
|
3464
|
+
{
|
|
3465
|
+
name: "get-organization",
|
|
3466
|
+
title: "Get organization",
|
|
3467
|
+
operationId: "getOrganization",
|
|
3468
|
+
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.",
|
|
3469
|
+
method: "GET",
|
|
3470
|
+
path: "/v2/organization",
|
|
3471
|
+
params: [],
|
|
3472
|
+
hasBody: false,
|
|
3473
|
+
annotations: {
|
|
3474
|
+
readOnlyHint: true,
|
|
3475
|
+
destructiveHint: false,
|
|
3476
|
+
idempotentHint: true,
|
|
3477
|
+
openWorldHint: true
|
|
3478
|
+
},
|
|
3479
|
+
inputSchema: {
|
|
3480
|
+
type: "object",
|
|
3481
|
+
properties: {}
|
|
3482
|
+
}
|
|
3483
|
+
},
|
|
3484
|
+
{
|
|
3485
|
+
name: "get-organization-group",
|
|
3486
|
+
title: "Get organization group",
|
|
3487
|
+
operationId: "getOrganizationGroup",
|
|
3488
|
+
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.",
|
|
3489
|
+
method: "GET",
|
|
3490
|
+
path: "/v2/organization/groups/{id}",
|
|
3491
|
+
params: [
|
|
3492
|
+
{
|
|
3493
|
+
name: "id",
|
|
3494
|
+
location: "path"
|
|
3495
|
+
}
|
|
3496
|
+
],
|
|
3497
|
+
hasBody: false,
|
|
3498
|
+
annotations: {
|
|
3499
|
+
readOnlyHint: true,
|
|
3500
|
+
destructiveHint: false,
|
|
3501
|
+
idempotentHint: true,
|
|
3502
|
+
openWorldHint: true
|
|
3503
|
+
},
|
|
3504
|
+
inputSchema: {
|
|
3505
|
+
type: "object",
|
|
3506
|
+
properties: {
|
|
3507
|
+
id: {
|
|
3508
|
+
type: "string",
|
|
3509
|
+
minLength: 1,
|
|
3510
|
+
description: "Group ID."
|
|
3511
|
+
}
|
|
3512
|
+
},
|
|
3513
|
+
required: ["id"]
|
|
3514
|
+
}
|
|
3515
|
+
},
|
|
3516
|
+
{
|
|
3517
|
+
name: "get-organization-invite",
|
|
3518
|
+
title: "Get organization invite",
|
|
3519
|
+
operationId: "getOrganizationInvite",
|
|
3520
|
+
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.",
|
|
3521
|
+
method: "GET",
|
|
3522
|
+
path: "/v2/organization/invites/{id}",
|
|
3523
|
+
params: [
|
|
3524
|
+
{
|
|
3525
|
+
name: "id",
|
|
3526
|
+
location: "path"
|
|
3527
|
+
}
|
|
3528
|
+
],
|
|
3529
|
+
hasBody: false,
|
|
3530
|
+
annotations: {
|
|
3531
|
+
readOnlyHint: true,
|
|
3532
|
+
destructiveHint: false,
|
|
3533
|
+
idempotentHint: true,
|
|
3534
|
+
openWorldHint: true
|
|
3535
|
+
},
|
|
3536
|
+
inputSchema: {
|
|
3537
|
+
type: "object",
|
|
3538
|
+
properties: {
|
|
3539
|
+
id: {
|
|
3540
|
+
type: "string",
|
|
3541
|
+
description: "Invite identifier"
|
|
2577
3542
|
}
|
|
2578
|
-
}
|
|
3543
|
+
},
|
|
3544
|
+
required: ["id"]
|
|
2579
3545
|
}
|
|
2580
3546
|
},
|
|
2581
3547
|
{
|
|
2582
|
-
name: "get-
|
|
2583
|
-
title: "Get
|
|
2584
|
-
operationId: "
|
|
2585
|
-
description: "Get
|
|
3548
|
+
name: "get-organization-role",
|
|
3549
|
+
title: "Get organization role",
|
|
3550
|
+
operationId: "getOrganizationRole",
|
|
3551
|
+
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.",
|
|
2586
3552
|
method: "GET",
|
|
2587
|
-
path: "/v2/
|
|
3553
|
+
path: "/v2/organization/roles/{id}",
|
|
2588
3554
|
params: [
|
|
2589
3555
|
{
|
|
2590
3556
|
name: "id",
|
|
@@ -2603,20 +3569,31 @@ var generatedTools = [
|
|
|
2603
3569
|
properties: {
|
|
2604
3570
|
id: {
|
|
2605
3571
|
type: "string",
|
|
2606
|
-
description: "
|
|
3572
|
+
description: "Role identifier"
|
|
2607
3573
|
}
|
|
2608
3574
|
},
|
|
2609
3575
|
required: ["id"]
|
|
2610
3576
|
}
|
|
2611
3577
|
},
|
|
2612
3578
|
{
|
|
2613
|
-
name: "get-organization",
|
|
2614
|
-
title: "Get organization",
|
|
2615
|
-
operationId: "
|
|
2616
|
-
description: "
|
|
3579
|
+
name: "get-organization-role-capabilities",
|
|
3580
|
+
title: "Get organization role capabilities",
|
|
3581
|
+
operationId: "getOrganizationRoleCapabilities",
|
|
3582
|
+
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.",
|
|
2617
3583
|
method: "GET",
|
|
2618
|
-
path: "/v2/organization",
|
|
2619
|
-
params: [
|
|
3584
|
+
path: "/v2/organization/roles/capabilities",
|
|
3585
|
+
params: [
|
|
3586
|
+
{
|
|
3587
|
+
name: "family",
|
|
3588
|
+
location: "query",
|
|
3589
|
+
explode: false
|
|
3590
|
+
},
|
|
3591
|
+
{
|
|
3592
|
+
name: "verb",
|
|
3593
|
+
location: "query",
|
|
3594
|
+
explode: false
|
|
3595
|
+
}
|
|
3596
|
+
],
|
|
2620
3597
|
hasBody: false,
|
|
2621
3598
|
annotations: {
|
|
2622
3599
|
readOnlyHint: true,
|
|
@@ -2626,7 +3603,22 @@ var generatedTools = [
|
|
|
2626
3603
|
},
|
|
2627
3604
|
inputSchema: {
|
|
2628
3605
|
type: "object",
|
|
2629
|
-
properties: {
|
|
3606
|
+
properties: {
|
|
3607
|
+
family: {
|
|
3608
|
+
type: "array",
|
|
3609
|
+
items: {
|
|
3610
|
+
type: "string"
|
|
3611
|
+
},
|
|
3612
|
+
description: "Only return these capability families, matched exactly. Comma-separated; a family matching any listed value is returned. An empty value is ignored."
|
|
3613
|
+
},
|
|
3614
|
+
verb: {
|
|
3615
|
+
type: "array",
|
|
3616
|
+
items: {
|
|
3617
|
+
type: "string"
|
|
3618
|
+
},
|
|
3619
|
+
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."
|
|
3620
|
+
}
|
|
3621
|
+
}
|
|
2630
3622
|
}
|
|
2631
3623
|
},
|
|
2632
3624
|
{
|
|
@@ -3109,6 +4101,107 @@ var generatedTools = [
|
|
|
3109
4101
|
}
|
|
3110
4102
|
}
|
|
3111
4103
|
},
|
|
4104
|
+
{
|
|
4105
|
+
name: "list-cost-center-resources",
|
|
4106
|
+
title: "List cost center resources",
|
|
4107
|
+
operationId: "listCostCenterResources",
|
|
4108
|
+
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.",
|
|
4109
|
+
method: "GET",
|
|
4110
|
+
path: "/v2/cost-centers/{id}/resources",
|
|
4111
|
+
params: [
|
|
4112
|
+
{
|
|
4113
|
+
name: "id",
|
|
4114
|
+
location: "path"
|
|
4115
|
+
},
|
|
4116
|
+
{
|
|
4117
|
+
name: "cursor",
|
|
4118
|
+
location: "query"
|
|
4119
|
+
},
|
|
4120
|
+
{
|
|
4121
|
+
name: "limit",
|
|
4122
|
+
location: "query"
|
|
4123
|
+
}
|
|
4124
|
+
],
|
|
4125
|
+
hasBody: false,
|
|
4126
|
+
annotations: {
|
|
4127
|
+
readOnlyHint: true,
|
|
4128
|
+
destructiveHint: false,
|
|
4129
|
+
idempotentHint: true,
|
|
4130
|
+
openWorldHint: true
|
|
4131
|
+
},
|
|
4132
|
+
inputSchema: {
|
|
4133
|
+
type: "object",
|
|
4134
|
+
properties: {
|
|
4135
|
+
id: {
|
|
4136
|
+
type: "string",
|
|
4137
|
+
minLength: 1,
|
|
4138
|
+
description: "Cost center identifier."
|
|
4139
|
+
},
|
|
4140
|
+
cursor: {
|
|
4141
|
+
type: "string",
|
|
4142
|
+
minLength: 1,
|
|
4143
|
+
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."
|
|
4144
|
+
},
|
|
4145
|
+
limit: {
|
|
4146
|
+
type: "integer",
|
|
4147
|
+
minimum: 1,
|
|
4148
|
+
maximum: 1e3,
|
|
4149
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
4150
|
+
}
|
|
4151
|
+
},
|
|
4152
|
+
required: ["id"]
|
|
4153
|
+
}
|
|
4154
|
+
},
|
|
4155
|
+
{
|
|
4156
|
+
name: "list-cost-centers",
|
|
4157
|
+
title: "List cost centers",
|
|
4158
|
+
operationId: "listCostCenters",
|
|
4159
|
+
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.",
|
|
4160
|
+
method: "GET",
|
|
4161
|
+
path: "/v2/cost-centers",
|
|
4162
|
+
params: [
|
|
4163
|
+
{
|
|
4164
|
+
name: "search",
|
|
4165
|
+
location: "query"
|
|
4166
|
+
},
|
|
4167
|
+
{
|
|
4168
|
+
name: "cursor",
|
|
4169
|
+
location: "query"
|
|
4170
|
+
},
|
|
4171
|
+
{
|
|
4172
|
+
name: "limit",
|
|
4173
|
+
location: "query"
|
|
4174
|
+
}
|
|
4175
|
+
],
|
|
4176
|
+
hasBody: false,
|
|
4177
|
+
annotations: {
|
|
4178
|
+
readOnlyHint: true,
|
|
4179
|
+
destructiveHint: false,
|
|
4180
|
+
idempotentHint: true,
|
|
4181
|
+
openWorldHint: true
|
|
4182
|
+
},
|
|
4183
|
+
inputSchema: {
|
|
4184
|
+
type: "object",
|
|
4185
|
+
properties: {
|
|
4186
|
+
search: {
|
|
4187
|
+
type: "string",
|
|
4188
|
+
minLength: 1,
|
|
4189
|
+
description: "Case-insensitive substring match against `value`."
|
|
4190
|
+
},
|
|
4191
|
+
cursor: {
|
|
4192
|
+
type: "string",
|
|
4193
|
+
minLength: 1,
|
|
4194
|
+
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."
|
|
4195
|
+
},
|
|
4196
|
+
limit: {
|
|
4197
|
+
type: "integer",
|
|
4198
|
+
minimum: 1,
|
|
4199
|
+
maximum: 1e3,
|
|
4200
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
4201
|
+
}
|
|
4202
|
+
}
|
|
4203
|
+
}
|
|
4204
|
+
},
|
|
3112
4205
|
{
|
|
3113
4206
|
name: "list-cpu-types",
|
|
3114
4207
|
title: "List CPU types",
|
|
@@ -3639,7 +4732,7 @@ var generatedTools = [
|
|
|
3639
4732
|
},
|
|
3640
4733
|
cloud: {
|
|
3641
4734
|
$ref: "#/$defs/GpuCloudFilter",
|
|
3642
|
-
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY.
|
|
4735
|
+
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Default when omitted: SECURE.",
|
|
3643
4736
|
type: "string"
|
|
3644
4737
|
},
|
|
3645
4738
|
countryCodes: {
|
|
@@ -3672,43 +4765,151 @@ var generatedTools = [
|
|
|
3672
4765
|
},
|
|
3673
4766
|
GpuCloudFilter: {
|
|
3674
4767
|
type: "string",
|
|
3675
|
-
description: "GPU availability cloud filter.",
|
|
3676
|
-
enum: ["SECURE", "COMMUNITY"]
|
|
4768
|
+
description: "GPU availability cloud filter.",
|
|
4769
|
+
enum: ["SECURE", "COMMUNITY"]
|
|
4770
|
+
},
|
|
4771
|
+
Product: {
|
|
4772
|
+
type: "string",
|
|
4773
|
+
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
4774
|
+
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
4775
|
+
}
|
|
4776
|
+
}
|
|
4777
|
+
}
|
|
4778
|
+
},
|
|
4779
|
+
{
|
|
4780
|
+
name: "list-network-volume-billing",
|
|
4781
|
+
title: "List network volume billing",
|
|
4782
|
+
operationId: "listNetworkVolumeBilling",
|
|
4783
|
+
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.",
|
|
4784
|
+
method: "GET",
|
|
4785
|
+
path: "/v2/billing/network-volumes",
|
|
4786
|
+
params: [
|
|
4787
|
+
{
|
|
4788
|
+
name: "startTime",
|
|
4789
|
+
location: "query"
|
|
4790
|
+
},
|
|
4791
|
+
{
|
|
4792
|
+
name: "endTime",
|
|
4793
|
+
location: "query"
|
|
4794
|
+
},
|
|
4795
|
+
{
|
|
4796
|
+
name: "bucketSize",
|
|
4797
|
+
location: "query"
|
|
4798
|
+
},
|
|
4799
|
+
{
|
|
4800
|
+
name: "lastN",
|
|
4801
|
+
location: "query"
|
|
4802
|
+
},
|
|
4803
|
+
{
|
|
4804
|
+
name: "networkVolumeId",
|
|
4805
|
+
location: "query"
|
|
4806
|
+
}
|
|
4807
|
+
],
|
|
4808
|
+
hasBody: false,
|
|
4809
|
+
annotations: {
|
|
4810
|
+
readOnlyHint: true,
|
|
4811
|
+
destructiveHint: false,
|
|
4812
|
+
idempotentHint: true,
|
|
4813
|
+
openWorldHint: true
|
|
4814
|
+
},
|
|
4815
|
+
inputSchema: {
|
|
4816
|
+
type: "object",
|
|
4817
|
+
properties: {
|
|
4818
|
+
startTime: {
|
|
4819
|
+
type: "string",
|
|
4820
|
+
format: "date-time",
|
|
4821
|
+
description: "Start of the billing period (RFC 3339). Defaults to 30 days ago."
|
|
4822
|
+
},
|
|
4823
|
+
endTime: {
|
|
4824
|
+
type: "string",
|
|
4825
|
+
format: "date-time",
|
|
4826
|
+
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."
|
|
4827
|
+
},
|
|
4828
|
+
bucketSize: {
|
|
4829
|
+
$ref: "#/$defs/BillingBucketSize",
|
|
4830
|
+
description: "Length of each billing time bucket. Defaults to day.",
|
|
4831
|
+
type: "string"
|
|
4832
|
+
},
|
|
4833
|
+
lastN: {
|
|
4834
|
+
type: "integer",
|
|
4835
|
+
minimum: 1,
|
|
4836
|
+
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".'
|
|
4837
|
+
},
|
|
4838
|
+
networkVolumeId: {
|
|
4839
|
+
type: "string",
|
|
4840
|
+
description: "Filter to a specific network volume."
|
|
4841
|
+
}
|
|
4842
|
+
},
|
|
4843
|
+
$defs: {
|
|
4844
|
+
BillingBucketSize: {
|
|
4845
|
+
type: "string",
|
|
4846
|
+
enum: ["hour", "day", "week", "month", "year"],
|
|
4847
|
+
default: "day",
|
|
4848
|
+
description: "Length of each billing time bucket.",
|
|
4849
|
+
examples: ["day"]
|
|
4850
|
+
}
|
|
4851
|
+
}
|
|
4852
|
+
}
|
|
4853
|
+
},
|
|
4854
|
+
{
|
|
4855
|
+
name: "list-network-volumes",
|
|
4856
|
+
title: "List network volumes",
|
|
4857
|
+
operationId: "listNetworkVolumes",
|
|
4858
|
+
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.",
|
|
4859
|
+
method: "GET",
|
|
4860
|
+
path: "/v2/network-volumes",
|
|
4861
|
+
params: [
|
|
4862
|
+
{
|
|
4863
|
+
name: "cursor",
|
|
4864
|
+
location: "query"
|
|
4865
|
+
},
|
|
4866
|
+
{
|
|
4867
|
+
name: "limit",
|
|
4868
|
+
location: "query"
|
|
4869
|
+
}
|
|
4870
|
+
],
|
|
4871
|
+
hasBody: false,
|
|
4872
|
+
annotations: {
|
|
4873
|
+
readOnlyHint: true,
|
|
4874
|
+
destructiveHint: false,
|
|
4875
|
+
idempotentHint: true,
|
|
4876
|
+
openWorldHint: true
|
|
4877
|
+
},
|
|
4878
|
+
inputSchema: {
|
|
4879
|
+
type: "object",
|
|
4880
|
+
properties: {
|
|
4881
|
+
cursor: {
|
|
4882
|
+
type: "string",
|
|
4883
|
+
minLength: 1,
|
|
4884
|
+
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."
|
|
3677
4885
|
},
|
|
3678
|
-
|
|
3679
|
-
type: "
|
|
3680
|
-
|
|
3681
|
-
|
|
4886
|
+
limit: {
|
|
4887
|
+
type: "integer",
|
|
4888
|
+
minimum: 1,
|
|
4889
|
+
maximum: 1e3,
|
|
4890
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
3682
4891
|
}
|
|
3683
4892
|
}
|
|
3684
4893
|
}
|
|
3685
4894
|
},
|
|
3686
4895
|
{
|
|
3687
|
-
name: "list-
|
|
3688
|
-
title: "List
|
|
3689
|
-
operationId: "
|
|
3690
|
-
description: "
|
|
4896
|
+
name: "list-organization-group-members",
|
|
4897
|
+
title: "List organization group members",
|
|
4898
|
+
operationId: "listOrganizationGroupMembers",
|
|
4899
|
+
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.",
|
|
3691
4900
|
method: "GET",
|
|
3692
|
-
path: "/v2/
|
|
4901
|
+
path: "/v2/organization/groups/{id}/members",
|
|
3693
4902
|
params: [
|
|
3694
4903
|
{
|
|
3695
|
-
name: "
|
|
3696
|
-
location: "
|
|
3697
|
-
},
|
|
3698
|
-
{
|
|
3699
|
-
name: "endTime",
|
|
3700
|
-
location: "query"
|
|
3701
|
-
},
|
|
3702
|
-
{
|
|
3703
|
-
name: "bucketSize",
|
|
3704
|
-
location: "query"
|
|
4904
|
+
name: "id",
|
|
4905
|
+
location: "path"
|
|
3705
4906
|
},
|
|
3706
4907
|
{
|
|
3707
|
-
name: "
|
|
4908
|
+
name: "cursor",
|
|
3708
4909
|
location: "query"
|
|
3709
4910
|
},
|
|
3710
4911
|
{
|
|
3711
|
-
name: "
|
|
4912
|
+
name: "limit",
|
|
3712
4913
|
location: "query"
|
|
3713
4914
|
}
|
|
3714
4915
|
],
|
|
@@ -3722,50 +4923,38 @@ var generatedTools = [
|
|
|
3722
4923
|
inputSchema: {
|
|
3723
4924
|
type: "object",
|
|
3724
4925
|
properties: {
|
|
3725
|
-
|
|
4926
|
+
id: {
|
|
3726
4927
|
type: "string",
|
|
3727
|
-
|
|
3728
|
-
description: "
|
|
4928
|
+
minLength: 1,
|
|
4929
|
+
description: "Group ID."
|
|
3729
4930
|
},
|
|
3730
|
-
|
|
4931
|
+
cursor: {
|
|
3731
4932
|
type: "string",
|
|
3732
|
-
|
|
3733
|
-
description: "
|
|
3734
|
-
},
|
|
3735
|
-
bucketSize: {
|
|
3736
|
-
$ref: "#/$defs/BillingBucketSize",
|
|
3737
|
-
description: "Length of each billing time bucket. Defaults to day.",
|
|
3738
|
-
type: "string"
|
|
4933
|
+
minLength: 1,
|
|
4934
|
+
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."
|
|
3739
4935
|
},
|
|
3740
|
-
|
|
4936
|
+
limit: {
|
|
3741
4937
|
type: "integer",
|
|
3742
4938
|
minimum: 1,
|
|
3743
|
-
|
|
3744
|
-
|
|
3745
|
-
networkVolumeId: {
|
|
3746
|
-
type: "string",
|
|
3747
|
-
description: "Filter to a specific network volume."
|
|
4939
|
+
maximum: 100,
|
|
4940
|
+
description: "Page size, 1\u2013100. Defaults to 100 when omitted."
|
|
3748
4941
|
}
|
|
3749
4942
|
},
|
|
3750
|
-
|
|
3751
|
-
BillingBucketSize: {
|
|
3752
|
-
type: "string",
|
|
3753
|
-
enum: ["hour", "day", "week", "month", "year"],
|
|
3754
|
-
default: "day",
|
|
3755
|
-
description: "Length of each billing time bucket.",
|
|
3756
|
-
examples: ["day"]
|
|
3757
|
-
}
|
|
3758
|
-
}
|
|
4943
|
+
required: ["id"]
|
|
3759
4944
|
}
|
|
3760
4945
|
},
|
|
3761
4946
|
{
|
|
3762
|
-
name: "list-
|
|
3763
|
-
title: "List
|
|
3764
|
-
operationId: "
|
|
3765
|
-
description: "List
|
|
4947
|
+
name: "list-organization-groups",
|
|
4948
|
+
title: "List organization groups",
|
|
4949
|
+
operationId: "listOrganizationGroups",
|
|
4950
|
+
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.",
|
|
3766
4951
|
method: "GET",
|
|
3767
|
-
path: "/v2/
|
|
4952
|
+
path: "/v2/organization/groups",
|
|
3768
4953
|
params: [
|
|
4954
|
+
{
|
|
4955
|
+
name: "name",
|
|
4956
|
+
location: "query"
|
|
4957
|
+
},
|
|
3769
4958
|
{
|
|
3770
4959
|
name: "cursor",
|
|
3771
4960
|
location: "query"
|
|
@@ -3785,6 +4974,10 @@ var generatedTools = [
|
|
|
3785
4974
|
inputSchema: {
|
|
3786
4975
|
type: "object",
|
|
3787
4976
|
properties: {
|
|
4977
|
+
name: {
|
|
4978
|
+
type: "string",
|
|
4979
|
+
description: "Optional case-insensitive substring of the group name. An empty value applies no filter."
|
|
4980
|
+
},
|
|
3788
4981
|
cursor: {
|
|
3789
4982
|
type: "string",
|
|
3790
4983
|
minLength: 1,
|
|
@@ -3793,12 +4986,52 @@ var generatedTools = [
|
|
|
3793
4986
|
limit: {
|
|
3794
4987
|
type: "integer",
|
|
3795
4988
|
minimum: 1,
|
|
3796
|
-
maximum:
|
|
3797
|
-
description: "Page size, 1\
|
|
4989
|
+
maximum: 100,
|
|
4990
|
+
description: "Page size, 1\u2013100. Defaults to 100 when omitted."
|
|
3798
4991
|
}
|
|
3799
4992
|
}
|
|
3800
4993
|
}
|
|
3801
4994
|
},
|
|
4995
|
+
{
|
|
4996
|
+
name: "list-organization-invites",
|
|
4997
|
+
title: "List organization invites",
|
|
4998
|
+
operationId: "listOrganizationInvites",
|
|
4999
|
+
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.",
|
|
5000
|
+
method: "GET",
|
|
5001
|
+
path: "/v2/organization/invites",
|
|
5002
|
+
params: [],
|
|
5003
|
+
hasBody: false,
|
|
5004
|
+
annotations: {
|
|
5005
|
+
readOnlyHint: true,
|
|
5006
|
+
destructiveHint: false,
|
|
5007
|
+
idempotentHint: true,
|
|
5008
|
+
openWorldHint: true
|
|
5009
|
+
},
|
|
5010
|
+
inputSchema: {
|
|
5011
|
+
type: "object",
|
|
5012
|
+
properties: {}
|
|
5013
|
+
}
|
|
5014
|
+
},
|
|
5015
|
+
{
|
|
5016
|
+
name: "list-organization-roles",
|
|
5017
|
+
title: "List organization roles",
|
|
5018
|
+
operationId: "listOrganizationRoles",
|
|
5019
|
+
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.",
|
|
5020
|
+
method: "GET",
|
|
5021
|
+
path: "/v2/organization/roles",
|
|
5022
|
+
params: [],
|
|
5023
|
+
hasBody: false,
|
|
5024
|
+
annotations: {
|
|
5025
|
+
readOnlyHint: true,
|
|
5026
|
+
destructiveHint: false,
|
|
5027
|
+
idempotentHint: true,
|
|
5028
|
+
openWorldHint: true
|
|
5029
|
+
},
|
|
5030
|
+
inputSchema: {
|
|
5031
|
+
type: "object",
|
|
5032
|
+
properties: {}
|
|
5033
|
+
}
|
|
5034
|
+
},
|
|
3802
5035
|
{
|
|
3803
5036
|
name: "list-organization-users",
|
|
3804
5037
|
title: "List organization users",
|
|
@@ -4153,6 +5386,47 @@ var generatedTools = [
|
|
|
4153
5386
|
}
|
|
4154
5387
|
}
|
|
4155
5388
|
},
|
|
5389
|
+
{
|
|
5390
|
+
name: "remove-organization-group-member",
|
|
5391
|
+
title: "Remove organization group member",
|
|
5392
|
+
operationId: "removeOrganizationGroupMember",
|
|
5393
|
+
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.",
|
|
5394
|
+
method: "DELETE",
|
|
5395
|
+
path: "/v2/organization/groups/{id}/members/{userId}",
|
|
5396
|
+
params: [
|
|
5397
|
+
{
|
|
5398
|
+
name: "id",
|
|
5399
|
+
location: "path"
|
|
5400
|
+
},
|
|
5401
|
+
{
|
|
5402
|
+
name: "userId",
|
|
5403
|
+
location: "path"
|
|
5404
|
+
}
|
|
5405
|
+
],
|
|
5406
|
+
hasBody: false,
|
|
5407
|
+
annotations: {
|
|
5408
|
+
readOnlyHint: false,
|
|
5409
|
+
destructiveHint: true,
|
|
5410
|
+
idempotentHint: true,
|
|
5411
|
+
openWorldHint: true
|
|
5412
|
+
},
|
|
5413
|
+
inputSchema: {
|
|
5414
|
+
type: "object",
|
|
5415
|
+
properties: {
|
|
5416
|
+
id: {
|
|
5417
|
+
type: "string",
|
|
5418
|
+
minLength: 1,
|
|
5419
|
+
description: "Group ID."
|
|
5420
|
+
},
|
|
5421
|
+
userId: {
|
|
5422
|
+
type: "string",
|
|
5423
|
+
minLength: 1,
|
|
5424
|
+
description: "Organization member user ID."
|
|
5425
|
+
}
|
|
5426
|
+
},
|
|
5427
|
+
required: ["id", "userId"]
|
|
5428
|
+
}
|
|
5429
|
+
},
|
|
4156
5430
|
{
|
|
4157
5431
|
name: "revoke-delegation",
|
|
4158
5432
|
title: "Revoke ECR delegation",
|
|
@@ -4233,6 +5507,59 @@ var generatedTools = [
|
|
|
4233
5507
|
}
|
|
4234
5508
|
}
|
|
4235
5509
|
},
|
|
5510
|
+
{
|
|
5511
|
+
name: "update-cost-center",
|
|
5512
|
+
title: "Update cost center",
|
|
5513
|
+
operationId: "updateCostCenter",
|
|
5514
|
+
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.",
|
|
5515
|
+
method: "PATCH",
|
|
5516
|
+
path: "/v2/cost-centers/{id}",
|
|
5517
|
+
params: [
|
|
5518
|
+
{
|
|
5519
|
+
name: "id",
|
|
5520
|
+
location: "path"
|
|
5521
|
+
}
|
|
5522
|
+
],
|
|
5523
|
+
hasBody: true,
|
|
5524
|
+
annotations: {
|
|
5525
|
+
readOnlyHint: false,
|
|
5526
|
+
destructiveHint: false,
|
|
5527
|
+
idempotentHint: true,
|
|
5528
|
+
openWorldHint: true
|
|
5529
|
+
},
|
|
5530
|
+
inputSchema: {
|
|
5531
|
+
type: "object",
|
|
5532
|
+
properties: {
|
|
5533
|
+
id: {
|
|
5534
|
+
type: "string",
|
|
5535
|
+
minLength: 1,
|
|
5536
|
+
description: "Cost center identifier."
|
|
5537
|
+
},
|
|
5538
|
+
body: {
|
|
5539
|
+
$ref: "#/$defs/UpdateCostCenterRequest",
|
|
5540
|
+
type: "object"
|
|
5541
|
+
}
|
|
5542
|
+
},
|
|
5543
|
+
required: ["id", "body"],
|
|
5544
|
+
$defs: {
|
|
5545
|
+
UpdateCostCenterRequest: {
|
|
5546
|
+
type: "object",
|
|
5547
|
+
additionalProperties: false,
|
|
5548
|
+
required: ["value"],
|
|
5549
|
+
properties: {
|
|
5550
|
+
value: {
|
|
5551
|
+
type: "string",
|
|
5552
|
+
minLength: 1,
|
|
5553
|
+
maxLength: 50,
|
|
5554
|
+
pattern: "^\\s*\\S",
|
|
5555
|
+
description: "Leading and trailing whitespace is trimmed.",
|
|
5556
|
+
examples: ["team-ml-eu"]
|
|
5557
|
+
}
|
|
5558
|
+
}
|
|
5559
|
+
}
|
|
5560
|
+
}
|
|
5561
|
+
}
|
|
5562
|
+
},
|
|
4236
5563
|
{
|
|
4237
5564
|
name: "update-endpoint",
|
|
4238
5565
|
title: "Update endpoint",
|
|
@@ -4620,19 +5947,130 @@ var generatedTools = [
|
|
|
4620
5947
|
}
|
|
4621
5948
|
}
|
|
4622
5949
|
}
|
|
4623
|
-
],
|
|
4624
|
-
unevaluatedProperties: false
|
|
5950
|
+
],
|
|
5951
|
+
unevaluatedProperties: false
|
|
5952
|
+
}
|
|
5953
|
+
}
|
|
5954
|
+
}
|
|
5955
|
+
},
|
|
5956
|
+
{
|
|
5957
|
+
name: "update-global-volume",
|
|
5958
|
+
title: "Update global volume",
|
|
5959
|
+
operationId: "updateGlobalVolume",
|
|
5960
|
+
description: "Update a global volume. Updates mutable fields on a global volume. Only provided fields are changed.",
|
|
5961
|
+
method: "PATCH",
|
|
5962
|
+
path: "/v2/global-volumes/{id}",
|
|
5963
|
+
params: [
|
|
5964
|
+
{
|
|
5965
|
+
name: "id",
|
|
5966
|
+
location: "path"
|
|
5967
|
+
}
|
|
5968
|
+
],
|
|
5969
|
+
hasBody: true,
|
|
5970
|
+
annotations: {
|
|
5971
|
+
readOnlyHint: false,
|
|
5972
|
+
destructiveHint: false,
|
|
5973
|
+
idempotentHint: true,
|
|
5974
|
+
openWorldHint: true
|
|
5975
|
+
},
|
|
5976
|
+
inputSchema: {
|
|
5977
|
+
type: "object",
|
|
5978
|
+
properties: {
|
|
5979
|
+
id: {
|
|
5980
|
+
type: "string",
|
|
5981
|
+
description: "Global volume identifier"
|
|
5982
|
+
},
|
|
5983
|
+
body: {
|
|
5984
|
+
$ref: "#/$defs/UpdateGlobalVolumeRequest",
|
|
5985
|
+
type: "object"
|
|
5986
|
+
}
|
|
5987
|
+
},
|
|
5988
|
+
required: ["id", "body"],
|
|
5989
|
+
$defs: {
|
|
5990
|
+
UpdateGlobalVolumeRequest: {
|
|
5991
|
+
type: "object",
|
|
5992
|
+
additionalProperties: false,
|
|
5993
|
+
minProperties: 1,
|
|
5994
|
+
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
5995
|
+
properties: {
|
|
5996
|
+
name: {
|
|
5997
|
+
type: "string",
|
|
5998
|
+
minLength: 1,
|
|
5999
|
+
maxLength: 191,
|
|
6000
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
6001
|
+
description: "New human-readable name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed.",
|
|
6002
|
+
examples: ["renamed-volume"]
|
|
6003
|
+
}
|
|
6004
|
+
}
|
|
6005
|
+
}
|
|
6006
|
+
}
|
|
6007
|
+
}
|
|
6008
|
+
},
|
|
6009
|
+
{
|
|
6010
|
+
name: "update-network-volume",
|
|
6011
|
+
title: "Update network volume",
|
|
6012
|
+
operationId: "updateNetworkVolume",
|
|
6013
|
+
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.",
|
|
6014
|
+
method: "PATCH",
|
|
6015
|
+
path: "/v2/network-volumes/{id}",
|
|
6016
|
+
params: [
|
|
6017
|
+
{
|
|
6018
|
+
name: "id",
|
|
6019
|
+
location: "path"
|
|
6020
|
+
}
|
|
6021
|
+
],
|
|
6022
|
+
hasBody: true,
|
|
6023
|
+
annotations: {
|
|
6024
|
+
readOnlyHint: false,
|
|
6025
|
+
destructiveHint: false,
|
|
6026
|
+
idempotentHint: true,
|
|
6027
|
+
openWorldHint: true
|
|
6028
|
+
},
|
|
6029
|
+
inputSchema: {
|
|
6030
|
+
type: "object",
|
|
6031
|
+
properties: {
|
|
6032
|
+
id: {
|
|
6033
|
+
type: "string",
|
|
6034
|
+
description: "Network volume identifier"
|
|
6035
|
+
},
|
|
6036
|
+
body: {
|
|
6037
|
+
$ref: "#/$defs/UpdateNetworkVolumeRequest",
|
|
6038
|
+
type: "object"
|
|
6039
|
+
}
|
|
6040
|
+
},
|
|
6041
|
+
required: ["id", "body"],
|
|
6042
|
+
$defs: {
|
|
6043
|
+
UpdateNetworkVolumeRequest: {
|
|
6044
|
+
type: "object",
|
|
6045
|
+
additionalProperties: false,
|
|
6046
|
+
minProperties: 1,
|
|
6047
|
+
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
6048
|
+
properties: {
|
|
6049
|
+
name: {
|
|
6050
|
+
type: "string",
|
|
6051
|
+
minLength: 1,
|
|
6052
|
+
description: "New human-readable name",
|
|
6053
|
+
examples: ["renamed-volume"]
|
|
6054
|
+
},
|
|
6055
|
+
size: {
|
|
6056
|
+
type: "integer",
|
|
6057
|
+
minimum: 10,
|
|
6058
|
+
maximum: 4096,
|
|
6059
|
+
description: "New size in GB. Must be greater than or equal to the current size \u2014 network volume storage cannot be reduced.",
|
|
6060
|
+
examples: [100]
|
|
6061
|
+
}
|
|
6062
|
+
}
|
|
4625
6063
|
}
|
|
4626
6064
|
}
|
|
4627
6065
|
}
|
|
4628
6066
|
},
|
|
4629
6067
|
{
|
|
4630
|
-
name: "update-
|
|
4631
|
-
title: "Update
|
|
4632
|
-
operationId: "
|
|
4633
|
-
description: "
|
|
6068
|
+
name: "update-organization-group",
|
|
6069
|
+
title: "Update organization group",
|
|
6070
|
+
operationId: "updateOrganizationGroup",
|
|
6071
|
+
description: "Rename a group in your current organization",
|
|
4634
6072
|
method: "PATCH",
|
|
4635
|
-
path: "/v2/
|
|
6073
|
+
path: "/v2/organization/groups/{id}",
|
|
4636
6074
|
params: [
|
|
4637
6075
|
{
|
|
4638
6076
|
name: "id",
|
|
@@ -4651,27 +6089,28 @@ var generatedTools = [
|
|
|
4651
6089
|
properties: {
|
|
4652
6090
|
id: {
|
|
4653
6091
|
type: "string",
|
|
4654
|
-
|
|
6092
|
+
minLength: 1,
|
|
6093
|
+
description: "Group ID."
|
|
4655
6094
|
},
|
|
4656
6095
|
body: {
|
|
4657
|
-
$ref: "#/$defs/
|
|
6096
|
+
$ref: "#/$defs/UpdateOrganizationGroupRequest",
|
|
4658
6097
|
type: "object"
|
|
4659
6098
|
}
|
|
4660
6099
|
},
|
|
4661
6100
|
required: ["id", "body"],
|
|
4662
6101
|
$defs: {
|
|
4663
|
-
|
|
6102
|
+
UpdateOrganizationGroupRequest: {
|
|
4664
6103
|
type: "object",
|
|
4665
6104
|
additionalProperties: false,
|
|
4666
|
-
|
|
4667
|
-
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
6105
|
+
required: ["name"],
|
|
4668
6106
|
properties: {
|
|
4669
6107
|
name: {
|
|
4670
6108
|
type: "string",
|
|
4671
6109
|
minLength: 1,
|
|
4672
6110
|
maxLength: 191,
|
|
4673
|
-
|
|
4674
|
-
|
|
6111
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
6112
|
+
description: "Group name with at least one non-whitespace character; surrounding whitespace is trimmed.",
|
|
6113
|
+
examples: ["Research"]
|
|
4675
6114
|
}
|
|
4676
6115
|
}
|
|
4677
6116
|
}
|
|
@@ -4679,12 +6118,12 @@ var generatedTools = [
|
|
|
4679
6118
|
}
|
|
4680
6119
|
},
|
|
4681
6120
|
{
|
|
4682
|
-
name: "update-
|
|
4683
|
-
title: "Update
|
|
4684
|
-
operationId: "
|
|
4685
|
-
description: "Update a
|
|
6121
|
+
name: "update-organization-role",
|
|
6122
|
+
title: "Update organization role",
|
|
6123
|
+
operationId: "updateOrganizationRole",
|
|
6124
|
+
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.",
|
|
4686
6125
|
method: "PATCH",
|
|
4687
|
-
path: "/v2/
|
|
6126
|
+
path: "/v2/organization/roles/{id}",
|
|
4688
6127
|
params: [
|
|
4689
6128
|
{
|
|
4690
6129
|
name: "id",
|
|
@@ -4694,7 +6133,7 @@ var generatedTools = [
|
|
|
4694
6133
|
hasBody: true,
|
|
4695
6134
|
annotations: {
|
|
4696
6135
|
readOnlyHint: false,
|
|
4697
|
-
destructiveHint:
|
|
6136
|
+
destructiveHint: true,
|
|
4698
6137
|
idempotentHint: true,
|
|
4699
6138
|
openWorldHint: true
|
|
4700
6139
|
},
|
|
@@ -4703,33 +6142,129 @@ var generatedTools = [
|
|
|
4703
6142
|
properties: {
|
|
4704
6143
|
id: {
|
|
4705
6144
|
type: "string",
|
|
4706
|
-
description: "
|
|
6145
|
+
description: "Role identifier"
|
|
4707
6146
|
},
|
|
4708
6147
|
body: {
|
|
4709
|
-
$ref: "#/$defs/
|
|
6148
|
+
$ref: "#/$defs/UpdateOrganizationRoleRequest",
|
|
4710
6149
|
type: "object"
|
|
4711
6150
|
}
|
|
4712
6151
|
},
|
|
4713
6152
|
required: ["id", "body"],
|
|
4714
6153
|
$defs: {
|
|
4715
|
-
|
|
6154
|
+
OrganizationRoleCapabilitiesInput: {
|
|
6155
|
+
type: "array",
|
|
6156
|
+
description: "What the role grants, as `FAMILY:VERB` capabilities from `get-organization-role-capabilities`. The caller must hold every capability it lists.",
|
|
6157
|
+
minItems: 1,
|
|
6158
|
+
uniqueItems: true,
|
|
6159
|
+
items: {
|
|
6160
|
+
type: "string",
|
|
6161
|
+
pattern: "^[A-Z0-9_]+:[A-Z0-9_]+$"
|
|
6162
|
+
},
|
|
6163
|
+
examples: [["POD:VIEW"]]
|
|
6164
|
+
},
|
|
6165
|
+
OrganizationRoleName: {
|
|
6166
|
+
type: "string",
|
|
6167
|
+
minLength: 1,
|
|
6168
|
+
maxLength: 191,
|
|
6169
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
6170
|
+
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.",
|
|
6171
|
+
examples: ["Pod viewer"]
|
|
6172
|
+
},
|
|
6173
|
+
UpdateOrganizationRoleRequest: {
|
|
4716
6174
|
type: "object",
|
|
4717
6175
|
additionalProperties: false,
|
|
4718
6176
|
minProperties: 1,
|
|
4719
|
-
description: "
|
|
6177
|
+
description: "The fields to change; omitted fields are unchanged. `capabilities` replaces the role's whole grant set rather than adding to it.",
|
|
4720
6178
|
properties: {
|
|
4721
6179
|
name: {
|
|
6180
|
+
$ref: "#/$defs/OrganizationRoleName"
|
|
6181
|
+
},
|
|
6182
|
+
capabilities: {
|
|
6183
|
+
$ref: "#/$defs/OrganizationRoleCapabilitiesInput"
|
|
6184
|
+
}
|
|
6185
|
+
}
|
|
6186
|
+
}
|
|
6187
|
+
}
|
|
6188
|
+
}
|
|
6189
|
+
},
|
|
6190
|
+
{
|
|
6191
|
+
name: "update-organization-user",
|
|
6192
|
+
title: "Update organization user",
|
|
6193
|
+
operationId: "updateOrganizationUser",
|
|
6194
|
+
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.",
|
|
6195
|
+
method: "PATCH",
|
|
6196
|
+
path: "/v2/organization/users/{id}",
|
|
6197
|
+
params: [
|
|
6198
|
+
{
|
|
6199
|
+
name: "id",
|
|
6200
|
+
location: "path"
|
|
6201
|
+
}
|
|
6202
|
+
],
|
|
6203
|
+
hasBody: true,
|
|
6204
|
+
annotations: {
|
|
6205
|
+
readOnlyHint: false,
|
|
6206
|
+
destructiveHint: true,
|
|
6207
|
+
idempotentHint: true,
|
|
6208
|
+
openWorldHint: true
|
|
6209
|
+
},
|
|
6210
|
+
inputSchema: {
|
|
6211
|
+
type: "object",
|
|
6212
|
+
properties: {
|
|
6213
|
+
id: {
|
|
6214
|
+
type: "string",
|
|
6215
|
+
description: "User identifier"
|
|
6216
|
+
},
|
|
6217
|
+
body: {
|
|
6218
|
+
$ref: "#/$defs/UpdateOrganizationUserRequest",
|
|
6219
|
+
type: "object"
|
|
6220
|
+
}
|
|
6221
|
+
},
|
|
6222
|
+
required: ["id", "body"],
|
|
6223
|
+
$defs: {
|
|
6224
|
+
OrganizationGroupInput: {
|
|
6225
|
+
type: "object",
|
|
6226
|
+
description: "An organization group, by ID.",
|
|
6227
|
+
additionalProperties: false,
|
|
6228
|
+
required: ["id"],
|
|
6229
|
+
properties: {
|
|
6230
|
+
id: {
|
|
4722
6231
|
type: "string",
|
|
4723
6232
|
minLength: 1,
|
|
4724
|
-
description: "
|
|
4725
|
-
examples: ["
|
|
6233
|
+
description: "Group ID.",
|
|
6234
|
+
examples: ["group_id_abc_123"]
|
|
6235
|
+
}
|
|
6236
|
+
}
|
|
6237
|
+
},
|
|
6238
|
+
OrganizationRoleInput: {
|
|
6239
|
+
type: "object",
|
|
6240
|
+
description: "An organization role to assign, by ID.",
|
|
6241
|
+
additionalProperties: false,
|
|
6242
|
+
required: ["id"],
|
|
6243
|
+
properties: {
|
|
6244
|
+
id: {
|
|
6245
|
+
type: "string",
|
|
6246
|
+
minLength: 1,
|
|
6247
|
+
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.",
|
|
6248
|
+
examples: ["builtin:dev"]
|
|
6249
|
+
}
|
|
6250
|
+
}
|
|
6251
|
+
},
|
|
6252
|
+
UpdateOrganizationUserRequest: {
|
|
6253
|
+
type: "object",
|
|
6254
|
+
description: "Changes to a member. Send `role`, `groups`, or both; an omitted field is left as it is.",
|
|
6255
|
+
additionalProperties: false,
|
|
6256
|
+
minProperties: 1,
|
|
6257
|
+
properties: {
|
|
6258
|
+
role: {
|
|
6259
|
+
$ref: "#/$defs/OrganizationRoleInput"
|
|
4726
6260
|
},
|
|
4727
|
-
|
|
4728
|
-
type: "
|
|
4729
|
-
|
|
4730
|
-
|
|
4731
|
-
|
|
4732
|
-
|
|
6261
|
+
groups: {
|
|
6262
|
+
type: "array",
|
|
6263
|
+
description: "The member's groups after the change: the whole set, by ID. An empty list removes the member from every group.",
|
|
6264
|
+
uniqueItems: true,
|
|
6265
|
+
items: {
|
|
6266
|
+
$ref: "#/$defs/OrganizationGroupInput"
|
|
6267
|
+
}
|
|
4733
6268
|
}
|
|
4734
6269
|
}
|
|
4735
6270
|
}
|
|
@@ -4740,7 +6275,7 @@ var generatedTools = [
|
|
|
4740
6275
|
name: "update-pod",
|
|
4741
6276
|
title: "Update Pod",
|
|
4742
6277
|
operationId: "updatePod",
|
|
4743
|
-
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.",
|
|
6278
|
+
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.",
|
|
4744
6279
|
method: "PATCH",
|
|
4745
6280
|
path: "/v2/pods/{id}",
|
|
4746
6281
|
params: [
|
|
@@ -4834,21 +6369,6 @@ var generatedTools = [
|
|
|
4834
6369
|
}
|
|
4835
6370
|
}
|
|
4836
6371
|
},
|
|
4837
|
-
BaseMounts: {
|
|
4838
|
-
type: "object",
|
|
4839
|
-
properties: {
|
|
4840
|
-
persistent: {
|
|
4841
|
-
$ref: "#/$defs/PersistentMount"
|
|
4842
|
-
},
|
|
4843
|
-
network: {
|
|
4844
|
-
type: "array",
|
|
4845
|
-
maxItems: 1,
|
|
4846
|
-
items: {
|
|
4847
|
-
$ref: "#/$defs/NetworkMount"
|
|
4848
|
-
}
|
|
4849
|
-
}
|
|
4850
|
-
}
|
|
4851
|
-
},
|
|
4852
6372
|
ContainerConfig: {
|
|
4853
6373
|
allOf: [
|
|
4854
6374
|
{
|
|
@@ -4866,11 +6386,11 @@ var generatedTools = [
|
|
|
4866
6386
|
}
|
|
4867
6387
|
]
|
|
4868
6388
|
},
|
|
4869
|
-
|
|
6389
|
+
GlobalMountPatch: {
|
|
4870
6390
|
type: "object",
|
|
4871
6391
|
required: ["volumeId"],
|
|
4872
6392
|
additionalProperties: false,
|
|
4873
|
-
description: "
|
|
6393
|
+
description: "Mounts, moves, or unmounts the pod's global volume.",
|
|
4874
6394
|
properties: {
|
|
4875
6395
|
volumeId: {
|
|
4876
6396
|
type: "string",
|
|
@@ -4879,38 +6399,21 @@ var generatedTools = [
|
|
|
4879
6399
|
},
|
|
4880
6400
|
path: {
|
|
4881
6401
|
type: "string",
|
|
4882
|
-
|
|
6402
|
+
minLength: 1,
|
|
6403
|
+
description: "Mount path inside the container. Optional; when mounting, a default is chosen for you if omitted.",
|
|
4883
6404
|
examples: ["/data"]
|
|
4884
|
-
}
|
|
4885
|
-
}
|
|
4886
|
-
},
|
|
4887
|
-
Mounts: {
|
|
4888
|
-
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.",
|
|
4889
|
-
allOf: [
|
|
4890
|
-
{
|
|
4891
|
-
$ref: "#/$defs/BaseMounts"
|
|
4892
6405
|
},
|
|
4893
|
-
{
|
|
4894
|
-
type: "
|
|
4895
|
-
|
|
4896
|
-
global: {
|
|
4897
|
-
type: "array",
|
|
4898
|
-
maxItems: 1,
|
|
4899
|
-
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.",
|
|
4900
|
-
items: {
|
|
4901
|
-
$ref: "#/$defs/GlobalMount"
|
|
4902
|
-
}
|
|
4903
|
-
}
|
|
4904
|
-
}
|
|
6406
|
+
remove: {
|
|
6407
|
+
type: "boolean",
|
|
6408
|
+
description: "Unmount the volume. Cannot be combined with `path`."
|
|
4905
6409
|
}
|
|
4906
|
-
|
|
4907
|
-
unevaluatedProperties: false
|
|
6410
|
+
}
|
|
4908
6411
|
},
|
|
4909
|
-
|
|
6412
|
+
NetworkMountPatch: {
|
|
4910
6413
|
type: "object",
|
|
4911
|
-
required: ["volumeId"
|
|
6414
|
+
required: ["volumeId"],
|
|
4912
6415
|
additionalProperties: false,
|
|
4913
|
-
description: "
|
|
6416
|
+
description: "Mounts, moves, or unmounts one network volume. Mounting a volume the pod does not have requires `path`.",
|
|
4914
6417
|
properties: {
|
|
4915
6418
|
volumeId: {
|
|
4916
6419
|
type: "string",
|
|
@@ -4919,27 +6422,62 @@ var generatedTools = [
|
|
|
4919
6422
|
},
|
|
4920
6423
|
path: {
|
|
4921
6424
|
type: "string",
|
|
4922
|
-
|
|
6425
|
+
minLength: 1,
|
|
6426
|
+
description: "Mount path inside the container. Required when mounting; optional when moving a mounted volume.",
|
|
4923
6427
|
examples: ["/runpod-volume"]
|
|
6428
|
+
},
|
|
6429
|
+
remove: {
|
|
6430
|
+
type: "boolean",
|
|
6431
|
+
description: "Unmount the volume. Cannot be combined with `path`."
|
|
4924
6432
|
}
|
|
4925
6433
|
}
|
|
4926
6434
|
},
|
|
4927
|
-
|
|
6435
|
+
PersistentMountPatch: {
|
|
4928
6436
|
type: "object",
|
|
4929
|
-
required: ["size", "path"],
|
|
4930
6437
|
additionalProperties: false,
|
|
4931
|
-
description: "
|
|
6438
|
+
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.",
|
|
4932
6439
|
properties: {
|
|
4933
6440
|
size: {
|
|
4934
6441
|
type: "integer",
|
|
4935
6442
|
minimum: 10,
|
|
4936
|
-
description: "
|
|
4937
|
-
examples: [
|
|
6443
|
+
description: "Volume disk size in GB. Can only grow; a smaller size than the current one is rejected.",
|
|
6444
|
+
examples: [50]
|
|
4938
6445
|
},
|
|
4939
6446
|
path: {
|
|
4940
6447
|
type: "string",
|
|
4941
|
-
|
|
6448
|
+
minLength: 1,
|
|
6449
|
+
description: "Mount path inside the container.",
|
|
4942
6450
|
examples: ["/workspace"]
|
|
6451
|
+
},
|
|
6452
|
+
remove: {
|
|
6453
|
+
type: "boolean",
|
|
6454
|
+
description: "Removes the volume disk. Not supported yet: `remove: true` is rejected."
|
|
6455
|
+
}
|
|
6456
|
+
}
|
|
6457
|
+
},
|
|
6458
|
+
UpdatePodMounts: {
|
|
6459
|
+
type: "object",
|
|
6460
|
+
additionalProperties: false,
|
|
6461
|
+
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.",
|
|
6462
|
+
properties: {
|
|
6463
|
+
persistent: {
|
|
6464
|
+
$ref: "#/$defs/PersistentMountPatch"
|
|
6465
|
+
},
|
|
6466
|
+
network: {
|
|
6467
|
+
type: "array",
|
|
6468
|
+
maxItems: 8,
|
|
6469
|
+
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.",
|
|
6470
|
+
items: {
|
|
6471
|
+
$ref: "#/$defs/NetworkMountPatch"
|
|
6472
|
+
}
|
|
6473
|
+
},
|
|
6474
|
+
global: {
|
|
6475
|
+
type: "array",
|
|
6476
|
+
maxItems: 2,
|
|
6477
|
+
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.",
|
|
6478
|
+
items: {
|
|
6479
|
+
$ref: "#/$defs/GlobalMountPatch"
|
|
6480
|
+
}
|
|
4943
6481
|
}
|
|
4944
6482
|
}
|
|
4945
6483
|
},
|
|
@@ -4960,7 +6498,7 @@ var generatedTools = [
|
|
|
4960
6498
|
description: "Lock the pod (true) or unlock it (false). Locked pods cannot be stopped or reset."
|
|
4961
6499
|
},
|
|
4962
6500
|
mounts: {
|
|
4963
|
-
$ref: "#/$defs/
|
|
6501
|
+
$ref: "#/$defs/UpdatePodMounts"
|
|
4964
6502
|
},
|
|
4965
6503
|
name: {
|
|
4966
6504
|
type: "string",
|
|
@@ -5207,7 +6745,7 @@ var generatedTools = [
|
|
|
5207
6745
|
size: {
|
|
5208
6746
|
type: "integer",
|
|
5209
6747
|
minimum: 10,
|
|
5210
|
-
description: "Host-local persistent storage in GB.
|
|
6748
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
5211
6749
|
examples: [20]
|
|
5212
6750
|
},
|
|
5213
6751
|
path: {
|
|
@@ -8231,23 +9769,40 @@ function createRunpodClient(options = {}) {
|
|
|
8231
9769
|
// src/specgen/clients/sse.ts
|
|
8232
9770
|
var LOG_STREAM_DEFAULT_WAIT_MS = 5e3;
|
|
8233
9771
|
var LOG_STREAM_MAX_BYTES = 256 * 1024;
|
|
9772
|
+
var LOG_STREAM_CONNECT_TIMEOUT_MS = 1e4;
|
|
9773
|
+
var LOG_SNAPSHOT_MAX_CHARS = 32e3;
|
|
8234
9774
|
function createSseReader(options = {}) {
|
|
8235
9775
|
const apiKey = options.apiKey ?? process.env.RUNPOD_API_KEY;
|
|
8236
9776
|
const fetchImpl = options.fetchImpl ?? fetch;
|
|
9777
|
+
const connectTimeoutMs = options.connectTimeoutMs ?? LOG_STREAM_CONNECT_TIMEOUT_MS;
|
|
8237
9778
|
return async (url, opts) => {
|
|
8238
9779
|
if (!apiKey) throw missingKeyError();
|
|
8239
9780
|
const chunks = [];
|
|
8240
9781
|
let bytes = 0;
|
|
8241
9782
|
let truncated = false;
|
|
8242
9783
|
let streamEstablished = false;
|
|
9784
|
+
const connect = new AbortController();
|
|
9785
|
+
const connectTimer = setTimeout(
|
|
9786
|
+
() => connect.abort(
|
|
9787
|
+
new DOMException(
|
|
9788
|
+
`Runpod log stream sent no headers within ${connectTimeoutMs}ms`,
|
|
9789
|
+
"TimeoutError"
|
|
9790
|
+
)
|
|
9791
|
+
),
|
|
9792
|
+
connectTimeoutMs
|
|
9793
|
+
);
|
|
8243
9794
|
try {
|
|
8244
|
-
const response = await createDeadlineFetch(
|
|
9795
|
+
const response = await createDeadlineFetch(
|
|
9796
|
+
fetchImpl,
|
|
9797
|
+
connectTimeoutMs + opts.maxWaitMs
|
|
9798
|
+
)(url, {
|
|
8245
9799
|
method: "GET",
|
|
8246
9800
|
headers: {
|
|
8247
9801
|
Authorization: `Bearer ${apiKey}`,
|
|
8248
9802
|
Accept: "text/event-stream"
|
|
8249
|
-
}
|
|
8250
|
-
|
|
9803
|
+
},
|
|
9804
|
+
signal: connect.signal
|
|
9805
|
+
}).finally(() => clearTimeout(connectTimer));
|
|
8251
9806
|
if (!response.ok) {
|
|
8252
9807
|
const body = await response.text().catch(() => "");
|
|
8253
9808
|
throw new HttpError(
|
|
@@ -8258,14 +9813,31 @@ function createSseReader(options = {}) {
|
|
|
8258
9813
|
}
|
|
8259
9814
|
streamEstablished = true;
|
|
8260
9815
|
if (response.body) {
|
|
8261
|
-
|
|
8262
|
-
|
|
8263
|
-
|
|
8264
|
-
|
|
8265
|
-
|
|
8266
|
-
|
|
8267
|
-
|
|
9816
|
+
const reader = response.body.getReader();
|
|
9817
|
+
let timer;
|
|
9818
|
+
const windowClosed = new Promise((resolve) => {
|
|
9819
|
+
timer = setTimeout(() => resolve(null), opts.maxWaitMs);
|
|
9820
|
+
});
|
|
9821
|
+
try {
|
|
9822
|
+
for (; ; ) {
|
|
9823
|
+
const read = reader.read();
|
|
9824
|
+
read.catch(() => {
|
|
9825
|
+
});
|
|
9826
|
+
const next = await Promise.race([read, windowClosed]);
|
|
9827
|
+
if (next === null || next.done) break;
|
|
9828
|
+
const boundedChunk = next.value.subarray(0, opts.maxBytes - bytes);
|
|
9829
|
+
chunks.push(boundedChunk);
|
|
9830
|
+
bytes += boundedChunk.length;
|
|
9831
|
+
if (bytes >= opts.maxBytes) {
|
|
9832
|
+
truncated = true;
|
|
9833
|
+
break;
|
|
9834
|
+
}
|
|
8268
9835
|
}
|
|
9836
|
+
} finally {
|
|
9837
|
+
clearTimeout(timer);
|
|
9838
|
+
void reader.cancel().catch(() => {
|
|
9839
|
+
});
|
|
9840
|
+
reader.releaseLock();
|
|
8269
9841
|
}
|
|
8270
9842
|
}
|
|
8271
9843
|
} catch (err) {
|
|
@@ -8291,7 +9863,80 @@ async function collectLogSnapshot(reader, logsUrl, params) {
|
|
|
8291
9863
|
for await (const event of iterateLogEvents(new Response(raw).body)) {
|
|
8292
9864
|
items.push(event.data);
|
|
8293
9865
|
}
|
|
8294
|
-
return
|
|
9866
|
+
return fitSnapshot(items, truncated);
|
|
9867
|
+
}
|
|
9868
|
+
var serializedLength = (snapshot) => JSON.stringify(snapshot, null, 2).length;
|
|
9869
|
+
var LOG_ENTRY_MAX_CHARS = 16e3;
|
|
9870
|
+
var CLIPPABLE_KEYS = ["line", "raw"];
|
|
9871
|
+
function clipText(text, keep) {
|
|
9872
|
+
const code = text.charCodeAt(keep - 1);
|
|
9873
|
+
if (keep > 0 && code >= 55296 && code <= 56319) keep--;
|
|
9874
|
+
return `${text.slice(0, keep)}\u2026 [clipped ${text.length - keep} chars]`;
|
|
9875
|
+
}
|
|
9876
|
+
function clipEntry(entry) {
|
|
9877
|
+
let clipped = false;
|
|
9878
|
+
const out = { ...entry };
|
|
9879
|
+
for (const key of CLIPPABLE_KEYS) {
|
|
9880
|
+
const text = out[key];
|
|
9881
|
+
if (typeof text === "string" && text.length > LOG_ENTRY_MAX_CHARS) {
|
|
9882
|
+
out[key] = clipText(text, LOG_ENTRY_MAX_CHARS);
|
|
9883
|
+
clipped = true;
|
|
9884
|
+
}
|
|
9885
|
+
}
|
|
9886
|
+
return { entry: out, clipped };
|
|
9887
|
+
}
|
|
9888
|
+
function fitEntry(entry, maxChars) {
|
|
9889
|
+
const size = (e) => serializedLength({ items: [e], count: 1, truncated: false });
|
|
9890
|
+
const out = { ...entry };
|
|
9891
|
+
const keys = Object.keys(out).filter((key) => key !== "ts" && typeof out[key] === "string").sort((a, b) => out[b].length - out[a].length);
|
|
9892
|
+
for (const key of keys) {
|
|
9893
|
+
if (size(out) <= maxChars) break;
|
|
9894
|
+
const text = entry[key];
|
|
9895
|
+
let lo = 0;
|
|
9896
|
+
let hi = Math.min(text.length, LOG_ENTRY_MAX_CHARS);
|
|
9897
|
+
while (lo < hi) {
|
|
9898
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
9899
|
+
if (size({ ...out, [key]: clipText(text, mid) }) <= maxChars)
|
|
9900
|
+
lo = mid;
|
|
9901
|
+
else hi = mid - 1;
|
|
9902
|
+
}
|
|
9903
|
+
out[key] = clipText(text, lo);
|
|
9904
|
+
}
|
|
9905
|
+
return out;
|
|
9906
|
+
}
|
|
9907
|
+
var entryTs = (entry) => entry?.ts;
|
|
9908
|
+
function fitSnapshot(items, truncated, maxChars = LOG_SNAPSHOT_MAX_CHARS) {
|
|
9909
|
+
let cut = truncated;
|
|
9910
|
+
const entries = items.map((item) => {
|
|
9911
|
+
const { entry, clipped } = clipEntry(item);
|
|
9912
|
+
if (clipped) cut = true;
|
|
9913
|
+
return entry;
|
|
9914
|
+
});
|
|
9915
|
+
const snapshot = (n, isCut) => ({
|
|
9916
|
+
items: entries.slice(0, n),
|
|
9917
|
+
count: n,
|
|
9918
|
+
truncated: isCut
|
|
9919
|
+
});
|
|
9920
|
+
const whole = snapshot(entries.length, cut);
|
|
9921
|
+
if (entries.length === 0 || serializedLength(whole) <= maxChars) return whole;
|
|
9922
|
+
if (serializedLength(snapshot(1, true)) > maxChars) {
|
|
9923
|
+
entries[0] = fitEntry(items[0], maxChars);
|
|
9924
|
+
if (entries.length === 1) return snapshot(1, true);
|
|
9925
|
+
}
|
|
9926
|
+
let lo = 1;
|
|
9927
|
+
let hi = entries.length - 1;
|
|
9928
|
+
while (lo < hi) {
|
|
9929
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
9930
|
+
if (serializedLength(snapshot(mid, true)) <= maxChars) lo = mid;
|
|
9931
|
+
else hi = mid - 1;
|
|
9932
|
+
}
|
|
9933
|
+
let keep = lo;
|
|
9934
|
+
const omittedTs = entryTs(entries[keep]);
|
|
9935
|
+
if (omittedTs !== void 0) {
|
|
9936
|
+
while (keep > 0 && entryTs(entries[keep - 1]) === omittedTs) keep--;
|
|
9937
|
+
if (keep === 0) keep = lo;
|
|
9938
|
+
}
|
|
9939
|
+
return snapshot(keep, true);
|
|
8295
9940
|
}
|
|
8296
9941
|
|
|
8297
9942
|
// src/specgen/tools/logs.ts
|
|
@@ -8309,13 +9954,13 @@ var logStreamProperties = {
|
|
|
8309
9954
|
},
|
|
8310
9955
|
since: {
|
|
8311
9956
|
type: "string",
|
|
8312
|
-
description: "RFC3339 timestamp to resume
|
|
9957
|
+
description: "RFC3339 timestamp to resume after (exclusive). Replays container lines only; system lines stream live from the call. When set, `tail` is ignored."
|
|
8313
9958
|
},
|
|
8314
9959
|
maxWaitMs: {
|
|
8315
9960
|
type: "integer",
|
|
8316
9961
|
minimum: 500,
|
|
8317
9962
|
maximum: 3e4,
|
|
8318
|
-
description: "How long to read the stream, in ms (default 5000, max 30000)"
|
|
9963
|
+
description: "How long to read the stream once it opens, in ms (default 5000, max 30000)"
|
|
8319
9964
|
}
|
|
8320
9965
|
};
|
|
8321
9966
|
function baseUrl() {
|
|
@@ -8341,7 +9986,7 @@ var streamPodLogs = {
|
|
|
8341
9986
|
title: "Stream Pod logs",
|
|
8342
9987
|
holdsResponse: true,
|
|
8343
9988
|
annotations: readOnly,
|
|
8344
|
-
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
|
|
9989
|
+
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`.",
|
|
8345
9990
|
inputSchema: {
|
|
8346
9991
|
type: "object",
|
|
8347
9992
|
properties: {
|
|
@@ -8363,10 +10008,10 @@ var streamPodLogs = {
|
|
|
8363
10008
|
var streamWorkerLogs = {
|
|
8364
10009
|
name: "stream-worker-logs",
|
|
8365
10010
|
title: "Stream worker logs",
|
|
8366
|
-
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
|
|
10011
|
+
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.",
|
|
8367
10012
|
holdsResponse: true,
|
|
8368
10013
|
annotations: readOnly,
|
|
8369
|
-
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
|
|
10014
|
+
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.",
|
|
8370
10015
|
inputSchema: {
|
|
8371
10016
|
type: "object",
|
|
8372
10017
|
properties: {
|
|
@@ -8512,6 +10157,24 @@ import {
|
|
|
8512
10157
|
loadKnowledge
|
|
8513
10158
|
} from "@runpod/plugin-knowledge";
|
|
8514
10159
|
var knowledge = loadKnowledge();
|
|
10160
|
+
var resolveGuideId = (id) => knowledge.aliases?.[id] ?? id;
|
|
10161
|
+
var hiddenRules = new Set(
|
|
10162
|
+
(process.env.KNOWLEDGE_HIDDEN_RULES ?? "").split(",").map((id) => id.trim()).filter(Boolean)
|
|
10163
|
+
);
|
|
10164
|
+
var concepts = knowledge.concepts.map((concept) => ({
|
|
10165
|
+
...concept,
|
|
10166
|
+
rules: concept.rules.filter((rule) => !hiddenRules.has(rule.id))
|
|
10167
|
+
}));
|
|
10168
|
+
for (const id of hiddenRules) {
|
|
10169
|
+
if (!knowledge.concepts.some(
|
|
10170
|
+
(concept) => concept.rules.some((rule) => rule.id === id)
|
|
10171
|
+
))
|
|
10172
|
+
console.warn("knowledge_hidden_rule_unknown", {
|
|
10173
|
+
id,
|
|
10174
|
+
plugin_version: knowledge.version
|
|
10175
|
+
});
|
|
10176
|
+
}
|
|
10177
|
+
var visibleRuleIds = (ids) => ids.filter((id) => !hiddenRules.has(id));
|
|
8515
10178
|
var GUIDE_KINDS = ["skill", "reference", "golden-path"];
|
|
8516
10179
|
var STOPWORDS = new Set(
|
|
8517
10180
|
"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(
|
|
@@ -8554,7 +10217,7 @@ var guideSummary = ({
|
|
|
8554
10217
|
lanes,
|
|
8555
10218
|
mcp,
|
|
8556
10219
|
needs_shell,
|
|
8557
|
-
concepts
|
|
10220
|
+
concepts: concepts2
|
|
8558
10221
|
}) => ({
|
|
8559
10222
|
id,
|
|
8560
10223
|
kind,
|
|
@@ -8563,7 +10226,7 @@ var guideSummary = ({
|
|
|
8563
10226
|
lanes,
|
|
8564
10227
|
mcp,
|
|
8565
10228
|
needs_shell,
|
|
8566
|
-
concepts
|
|
10229
|
+
concepts: concepts2
|
|
8567
10230
|
});
|
|
8568
10231
|
function linkedGuides(conceptId) {
|
|
8569
10232
|
const byId = new Map(knowledge.guides.map((guide) => [guide.id, guide]));
|
|
@@ -8575,19 +10238,20 @@ function linkedGuides(conceptId) {
|
|
|
8575
10238
|
seen.add(link.from);
|
|
8576
10239
|
const guide = byId.get(link.from);
|
|
8577
10240
|
if (!guide) continue;
|
|
10241
|
+
const rules = link.rules && visibleRuleIds(link.rules);
|
|
8578
10242
|
if (guide.kind === "golden-path")
|
|
8579
10243
|
examples.push({ id: guide.id, title: guide.title, mcp: guide.mcp });
|
|
8580
10244
|
else
|
|
8581
10245
|
docs.push({
|
|
8582
10246
|
id: guide.id,
|
|
8583
10247
|
title: guide.title,
|
|
8584
|
-
...
|
|
10248
|
+
...rules?.length ? { rules } : {}
|
|
8585
10249
|
});
|
|
8586
10250
|
}
|
|
8587
10251
|
return { examples, docs };
|
|
8588
10252
|
}
|
|
8589
10253
|
var conceptIndex = /* @__PURE__ */ new Map();
|
|
8590
|
-
for (const concept of
|
|
10254
|
+
for (const concept of concepts) {
|
|
8591
10255
|
for (const key of [concept.id, concept.name, ...concept.aliases]) {
|
|
8592
10256
|
if (!conceptIndex.has(key.toLowerCase()))
|
|
8593
10257
|
conceptIndex.set(key.toLowerCase(), concept);
|
|
@@ -8621,7 +10285,7 @@ function resolveConcept(input) {
|
|
|
8621
10285
|
return best && !tied ? { concept: best.concept, matchedAs: best.key } : void 0;
|
|
8622
10286
|
}
|
|
8623
10287
|
var ruleIndex = /* @__PURE__ */ new Map();
|
|
8624
|
-
for (const concept of
|
|
10288
|
+
for (const concept of concepts) {
|
|
8625
10289
|
for (const rule of concept.rules) ruleIndex.set(rule.id, { rule, concept });
|
|
8626
10290
|
}
|
|
8627
10291
|
var source = {
|
|
@@ -8670,7 +10334,9 @@ var readGuide = {
|
|
|
8670
10334
|
title: "Read guide",
|
|
8671
10335
|
annotations: bundledRead,
|
|
8672
10336
|
recordedArguments: ["id"],
|
|
8673
|
-
recordedGuideKind: (args) => knowledge.guides.find(
|
|
10337
|
+
recordedGuideKind: (args) => knowledge.guides.find(
|
|
10338
|
+
(guide) => guide.id === resolveGuideId(String(args.id).trim())
|
|
10339
|
+
)?.kind,
|
|
8674
10340
|
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").',
|
|
8675
10341
|
inputSchema: {
|
|
8676
10342
|
type: "object",
|
|
@@ -8682,7 +10348,9 @@ var readGuide = {
|
|
|
8682
10348
|
},
|
|
8683
10349
|
handler: async (_ctx, args) => {
|
|
8684
10350
|
const id = String(args.id).trim();
|
|
8685
|
-
const guide = knowledge.guides.find(
|
|
10351
|
+
const guide = knowledge.guides.find(
|
|
10352
|
+
(candidate) => candidate.id === resolveGuideId(id)
|
|
10353
|
+
);
|
|
8686
10354
|
if (!guide) {
|
|
8687
10355
|
const close = knowledge.guides.filter(
|
|
8688
10356
|
(candidate) => candidate.id.includes(id) || id.includes(candidate.id)
|
|
@@ -8740,7 +10408,7 @@ var lookupConcept = {
|
|
|
8740
10408
|
};
|
|
8741
10409
|
}
|
|
8742
10410
|
const { concept, matchedAs } = resolved;
|
|
8743
|
-
const pointedAtBy =
|
|
10411
|
+
const pointedAtBy = concepts.flatMap((other) => [
|
|
8744
10412
|
...other.is_a === concept.id ? [{ concept: other.id, type: "is_a" }] : [],
|
|
8745
10413
|
...other.part_of === concept.id ? [{ concept: other.id, type: "part_of" }] : [],
|
|
8746
10414
|
...other.relations.filter((relation) => relation.target === concept.id).map((relation) => ({ concept: other.id, type: relation.type }))
|
|
@@ -8754,6 +10422,14 @@ var lookupConcept = {
|
|
|
8754
10422
|
...source,
|
|
8755
10423
|
...matchedAs ? { matched_as: matchedAs } : {},
|
|
8756
10424
|
...concept,
|
|
10425
|
+
steps: concept.steps.map((step) => ({
|
|
10426
|
+
...step,
|
|
10427
|
+
rules: visibleRuleIds(step.rules)
|
|
10428
|
+
})),
|
|
10429
|
+
rules: concept.rules.map((rule) => ({
|
|
10430
|
+
...rule,
|
|
10431
|
+
see: visibleRuleIds(rule.see)
|
|
10432
|
+
})),
|
|
8757
10433
|
pointed_at_by: pointedAtBy,
|
|
8758
10434
|
linked_rules: linkedRules,
|
|
8759
10435
|
...linkedGuides(concept.id)
|
|
@@ -8829,6 +10505,12 @@ var guideResources = knowledge.guides.map((guide) => ({
|
|
|
8829
10505
|
mimeType: "text/markdown",
|
|
8830
10506
|
text: guide.body
|
|
8831
10507
|
}));
|
|
10508
|
+
var findGuideResource = (resources, uri) => {
|
|
10509
|
+
const id = uri.startsWith(GUIDE_URI_PREFIX) ? resolveGuideId(uri.slice(GUIDE_URI_PREFIX.length)) : void 0;
|
|
10510
|
+
return resources.find(
|
|
10511
|
+
(resource) => resource.uri === uri || resource.uri === GUIDE_URI_PREFIX + id
|
|
10512
|
+
);
|
|
10513
|
+
};
|
|
8832
10514
|
|
|
8833
10515
|
// src/specgen/prose.ts
|
|
8834
10516
|
var ABBREVIATIONS = ["e.g.", "i.e.", "etc.", "vs."];
|
|
@@ -9012,7 +10694,7 @@ function words2(name) {
|
|
|
9012
10694
|
|
|
9013
10695
|
// src/server.ts
|
|
9014
10696
|
var SERVER_NAME = "Runpod API Server";
|
|
9015
|
-
var SERVER_VERSION = true ? "4.
|
|
10697
|
+
var SERVER_VERSION = true ? "4.10.1" : "dev";
|
|
9016
10698
|
|
|
9017
10699
|
// src/specgen/analytics.ts
|
|
9018
10700
|
import { createHmac } from "crypto";
|
|
@@ -9080,6 +10762,7 @@ function captureToolCall(apiKey, event) {
|
|
|
9080
10762
|
server_version: event.serverVersion,
|
|
9081
10763
|
...event.clientName ? { client_name: event.clientName } : {},
|
|
9082
10764
|
...event.guideKind ? { guide_kind: event.guideKind } : {},
|
|
10765
|
+
...event.errorClass ? { error_class: event.errorClass } : {},
|
|
9083
10766
|
...event.blockedBy ? { blocked_by: event.blockedBy } : {},
|
|
9084
10767
|
...event.profile ? { profile: event.profile } : {},
|
|
9085
10768
|
...args
|
|
@@ -9703,7 +11386,7 @@ These tools manage infrastructure only. They do not do SSH sessions, file transf
|
|
|
9703
11386
|
|
|
9704
11387
|
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.
|
|
9705
11388
|
|
|
9706
|
-
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.
|
|
11389
|
+
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.
|
|
9707
11390
|
|
|
9708
11391
|
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.
|
|
9709
11392
|
|
|
@@ -9764,9 +11447,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
9764
11447
|
resourceTemplates: []
|
|
9765
11448
|
}));
|
|
9766
11449
|
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
9767
|
-
const guide = servedGuides.
|
|
9768
|
-
(candidate) => candidate.uri === request.params.uri
|
|
9769
|
-
);
|
|
11450
|
+
const guide = findGuideResource(servedGuides, request.params.uri);
|
|
9770
11451
|
if (opts.analytics) {
|
|
9771
11452
|
captureResourceCall(ctx.apiKey, {
|
|
9772
11453
|
method: "resources/read",
|
|
@@ -9803,6 +11484,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
9803
11484
|
ok: false,
|
|
9804
11485
|
status: 429,
|
|
9805
11486
|
durationMs: 0,
|
|
11487
|
+
errorClass: "rate_limited",
|
|
9806
11488
|
...verdict.reason ? { blockedBy: verdict.reason } : {},
|
|
9807
11489
|
profile,
|
|
9808
11490
|
...opts.analytics
|
|
@@ -9828,6 +11510,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
9828
11510
|
const generated = servedGeneratedTools.find(
|
|
9829
11511
|
(tool) => tool.name === request.params.name
|
|
9830
11512
|
);
|
|
11513
|
+
const curatedArgs = curated ? withoutNullOptionals(curated.inputSchema, args) : args;
|
|
9831
11514
|
const omitted = directory ? directoryOmittedInputs(request.params.name).filter((key) => key in args) : [];
|
|
9832
11515
|
const rejected = omitted.length ? {
|
|
9833
11516
|
ok: false,
|
|
@@ -9837,10 +11520,10 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
9837
11520
|
}
|
|
9838
11521
|
} : curated && !curated.lenientArguments ? validateArguments(
|
|
9839
11522
|
curated.inputSchema,
|
|
9840
|
-
|
|
11523
|
+
curatedArgs
|
|
9841
11524
|
) : null;
|
|
9842
11525
|
const result = rejected ?? await runTool(
|
|
9843
|
-
() => curated ? curated.handler(ctx,
|
|
11526
|
+
() => curated ? curated.handler(ctx, curatedArgs) : dispatchTool(generated, request.params.name, args)
|
|
9844
11527
|
);
|
|
9845
11528
|
logToolCall({
|
|
9846
11529
|
tool: request.params.name,
|
|
@@ -9855,6 +11538,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
9855
11538
|
ok: result.ok,
|
|
9856
11539
|
status: result.status,
|
|
9857
11540
|
durationMs: Date.now() - startedAt,
|
|
11541
|
+
...result.ok ? {} : { errorClass: errorClass(result) },
|
|
9858
11542
|
// The directory profile records which tool ran, never what was asked.
|
|
9859
11543
|
...directory ? {} : {
|
|
9860
11544
|
args: recordedArgumentValues(curated?.recordedArguments, args),
|
|
@@ -9894,24 +11578,50 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
9894
11578
|
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.";
|
|
9895
11579
|
var DETAIL_HINTS = [
|
|
9896
11580
|
[
|
|
9897
|
-
/no longer any instances available|not enough free GPUs/i,
|
|
9898
|
-
"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."
|
|
11581
|
+
/no longer any instances available|no instances currently available|not enough free GPUs/i,
|
|
11582
|
+
"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.",
|
|
11583
|
+
"capacity"
|
|
9899
11584
|
],
|
|
9900
11585
|
[
|
|
9901
11586
|
/at least \$\d|insufficient (?:funds|balance)|\bbalance\b/i,
|
|
9902
|
-
"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."
|
|
11587
|
+
"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.",
|
|
11588
|
+
"balance"
|
|
9903
11589
|
],
|
|
9904
11590
|
[
|
|
9905
11591
|
/mutually exclusive|cannot be combined with/i,
|
|
9906
|
-
"Two arguments conflict: send only one of them and leave the other out entirely. Do not change anything else."
|
|
11592
|
+
"Two arguments conflict: send only one of them and leave the other out entirely. Do not change anything else.",
|
|
11593
|
+
"conflicting_args"
|
|
11594
|
+
],
|
|
11595
|
+
// A 400 with a bare "Unauthorized" detail from a write the same key can
|
|
11596
|
+
// otherwise make is upstream's answer for an unfunded account.
|
|
11597
|
+
[
|
|
11598
|
+
/^\s*unauthorized\s*$/i,
|
|
11599
|
+
"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.",
|
|
11600
|
+
"balance"
|
|
9907
11601
|
]
|
|
9908
11602
|
];
|
|
11603
|
+
function errorClass(result) {
|
|
11604
|
+
const { status } = result;
|
|
11605
|
+
const payload = asRecord(result.payload) ?? { error: result.payload };
|
|
11606
|
+
const detail = detailText(payload);
|
|
11607
|
+
if (status === 400 && detail) {
|
|
11608
|
+
for (const [pattern, , cls] of DETAIL_HINTS)
|
|
11609
|
+
if (pattern.test(detail)) return cls;
|
|
11610
|
+
}
|
|
11611
|
+
if (status === 400 || status === 422) return "validation";
|
|
11612
|
+
if (status === 401) return "auth";
|
|
11613
|
+
if (status === 402) return "balance";
|
|
11614
|
+
if (status === 403) return "permission";
|
|
11615
|
+
if (status === 404) return "not_found";
|
|
11616
|
+
if (status === 429) return "rate_limited";
|
|
11617
|
+
if (status === 504) return "timeout";
|
|
11618
|
+
if (status >= 500) return "server";
|
|
11619
|
+
return "other";
|
|
11620
|
+
}
|
|
9909
11621
|
function errorHint(status, detail) {
|
|
9910
11622
|
if (status === 400 && detail) {
|
|
9911
11623
|
for (const [pattern, hint] of DETAIL_HINTS)
|
|
9912
11624
|
if (pattern.test(detail)) return hint;
|
|
9913
|
-
if (/^unauthorized$/i.test(detail.trim()))
|
|
9914
|
-
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.";
|
|
9915
11625
|
}
|
|
9916
11626
|
if (status === 400 || status === 422) return SHAPE_HINT;
|
|
9917
11627
|
if (status === 401) return "The Runpod API key is missing or invalid.";
|
|
@@ -10668,4 +12378,4 @@ export {
|
|
|
10668
12378
|
summarizeRpc,
|
|
10669
12379
|
handleMcpRequest
|
|
10670
12380
|
};
|
|
10671
|
-
//# sourceMappingURL=chunk-
|
|
12381
|
+
//# sourceMappingURL=chunk-AKX5ZMCL.mjs.map
|