@runpod/mcp-server 4.9.1 → 4.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +2 -11
- package/dist/alp.cjs +21 -2
- package/dist/alp.cjs.map +1 -1
- package/dist/alp.d.cts +2 -1
- package/dist/alp.d.ts +2 -1
- package/dist/alp.mjs +3 -1
- package/dist/{chunk-N4OSRS4A.mjs → chunk-AKX5ZMCL.mjs} +1931 -221
- package/dist/chunk-AKX5ZMCL.mjs.map +1 -0
- package/dist/{chunk-6IETGSON.mjs → chunk-FQJFKWUV.mjs} +32 -1
- package/dist/chunk-FQJFKWUV.mjs.map +1 -0
- package/dist/{chunk-H3NZYQIB.mjs → chunk-WWXM5EES.mjs} +20 -3
- package/dist/chunk-WWXM5EES.mjs.map +1 -0
- package/dist/hosted.cjs +1986 -217
- package/dist/hosted.cjs.map +1 -1
- package/dist/hosted.mjs +16 -5
- package/dist/hosted.mjs.map +1 -1
- package/dist/http.cjs +1960 -219
- package/dist/http.cjs.map +1 -1
- package/dist/http.mjs +2 -2
- package/dist/specgen/profile.cjs +31 -0
- package/dist/specgen/profile.cjs.map +1 -1
- package/dist/specgen/profile.mjs +1 -1
- package/dist/stdio.cjs +1960 -219
- package/dist/stdio.cjs.map +1 -1
- package/dist/stdio.mjs +1960 -219
- package/dist/stdio.mjs.map +1 -1
- package/package.json +4 -3
- package/dist/chunk-6IETGSON.mjs.map +0 -1
- package/dist/chunk-H3NZYQIB.mjs.map +0 -1
- package/dist/chunk-N4OSRS4A.mjs.map +0 -1
package/dist/stdio.cjs
CHANGED
|
@@ -1183,7 +1183,7 @@ var import_stdio = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
|
1183
1183
|
|
|
1184
1184
|
// src/server.ts
|
|
1185
1185
|
var SERVER_NAME = "Runpod API Server";
|
|
1186
|
-
var SERVER_VERSION = true ? "4.
|
|
1186
|
+
var SERVER_VERSION = true ? "4.10.1" : "dev";
|
|
1187
1187
|
|
|
1188
1188
|
// src/specgen/server.ts
|
|
1189
1189
|
var import_server3 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
@@ -1384,6 +1384,14 @@ function validateArguments(inputSchema, args) {
|
|
|
1384
1384
|
}
|
|
1385
1385
|
return null;
|
|
1386
1386
|
}
|
|
1387
|
+
function withoutNullOptionals(inputSchema, args) {
|
|
1388
|
+
const required = new Set(inputSchema.required ?? []);
|
|
1389
|
+
return Object.fromEntries(
|
|
1390
|
+
Object.entries(args).filter(
|
|
1391
|
+
([name, value]) => value !== null || required.has(name)
|
|
1392
|
+
)
|
|
1393
|
+
);
|
|
1394
|
+
}
|
|
1387
1395
|
async function dispatchGeneratedTool(client, tool, args) {
|
|
1388
1396
|
const rejected = validateArguments(tool.inputSchema, args);
|
|
1389
1397
|
if (rejected) return rejected;
|
|
@@ -1508,6 +1516,104 @@ function coerceScalars(value, schema, defs, depth = 0) {
|
|
|
1508
1516
|
|
|
1509
1517
|
// src/specgen/generated/tools.gen.ts
|
|
1510
1518
|
var generatedTools = [
|
|
1519
|
+
{
|
|
1520
|
+
name: "add-organization-group-member",
|
|
1521
|
+
title: "Add organization group member",
|
|
1522
|
+
operationId: "addOrganizationGroupMember",
|
|
1523
|
+
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.",
|
|
1524
|
+
method: "PUT",
|
|
1525
|
+
path: "/v2/organization/groups/{id}/members/{userId}",
|
|
1526
|
+
params: [
|
|
1527
|
+
{
|
|
1528
|
+
name: "id",
|
|
1529
|
+
location: "path"
|
|
1530
|
+
},
|
|
1531
|
+
{
|
|
1532
|
+
name: "userId",
|
|
1533
|
+
location: "path"
|
|
1534
|
+
}
|
|
1535
|
+
],
|
|
1536
|
+
hasBody: false,
|
|
1537
|
+
annotations: {
|
|
1538
|
+
readOnlyHint: false,
|
|
1539
|
+
destructiveHint: false,
|
|
1540
|
+
idempotentHint: true,
|
|
1541
|
+
openWorldHint: true
|
|
1542
|
+
},
|
|
1543
|
+
inputSchema: {
|
|
1544
|
+
type: "object",
|
|
1545
|
+
properties: {
|
|
1546
|
+
id: {
|
|
1547
|
+
type: "string",
|
|
1548
|
+
minLength: 1,
|
|
1549
|
+
description: "Group ID."
|
|
1550
|
+
},
|
|
1551
|
+
userId: {
|
|
1552
|
+
type: "string",
|
|
1553
|
+
minLength: 1,
|
|
1554
|
+
description: "Organization member user ID."
|
|
1555
|
+
}
|
|
1556
|
+
},
|
|
1557
|
+
required: ["id", "userId"]
|
|
1558
|
+
}
|
|
1559
|
+
},
|
|
1560
|
+
{
|
|
1561
|
+
name: "attach-cost-center-resource",
|
|
1562
|
+
title: "Attach cost center resource",
|
|
1563
|
+
operationId: "attachCostCenterResource",
|
|
1564
|
+
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.",
|
|
1565
|
+
method: "PUT",
|
|
1566
|
+
path: "/v2/cost-centers/{id}/{resourceType}/{resourceId}",
|
|
1567
|
+
params: [
|
|
1568
|
+
{
|
|
1569
|
+
name: "id",
|
|
1570
|
+
location: "path"
|
|
1571
|
+
},
|
|
1572
|
+
{
|
|
1573
|
+
name: "resourceType",
|
|
1574
|
+
location: "path"
|
|
1575
|
+
},
|
|
1576
|
+
{
|
|
1577
|
+
name: "resourceId",
|
|
1578
|
+
location: "path"
|
|
1579
|
+
}
|
|
1580
|
+
],
|
|
1581
|
+
hasBody: false,
|
|
1582
|
+
annotations: {
|
|
1583
|
+
readOnlyHint: false,
|
|
1584
|
+
destructiveHint: false,
|
|
1585
|
+
idempotentHint: true,
|
|
1586
|
+
openWorldHint: true
|
|
1587
|
+
},
|
|
1588
|
+
inputSchema: {
|
|
1589
|
+
type: "object",
|
|
1590
|
+
properties: {
|
|
1591
|
+
id: {
|
|
1592
|
+
type: "string",
|
|
1593
|
+
minLength: 1,
|
|
1594
|
+
description: "Cost center identifier."
|
|
1595
|
+
},
|
|
1596
|
+
resourceType: {
|
|
1597
|
+
$ref: "#/$defs/ResourceType",
|
|
1598
|
+
description: "Kind of resource.",
|
|
1599
|
+
type: "string"
|
|
1600
|
+
},
|
|
1601
|
+
resourceId: {
|
|
1602
|
+
type: "string",
|
|
1603
|
+
minLength: 1,
|
|
1604
|
+
description: "Resource identifier."
|
|
1605
|
+
}
|
|
1606
|
+
},
|
|
1607
|
+
required: ["id", "resourceType", "resourceId"],
|
|
1608
|
+
$defs: {
|
|
1609
|
+
ResourceType: {
|
|
1610
|
+
type: "string",
|
|
1611
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
1612
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
},
|
|
1511
1617
|
{
|
|
1512
1618
|
name: "create-cluster",
|
|
1513
1619
|
title: "Create cluster",
|
|
@@ -1606,7 +1712,6 @@ var generatedTools = [
|
|
|
1606
1712
|
},
|
|
1607
1713
|
network: {
|
|
1608
1714
|
type: "array",
|
|
1609
|
-
maxItems: 1,
|
|
1610
1715
|
items: {
|
|
1611
1716
|
$ref: "#/$defs/NetworkMount"
|
|
1612
1717
|
}
|
|
@@ -1628,7 +1733,7 @@ var generatedTools = [
|
|
|
1628
1733
|
gpuCountPerPod: {
|
|
1629
1734
|
type: "integer",
|
|
1630
1735
|
minimum: 1,
|
|
1631
|
-
description: "Number of GPUs on each pod. Bounded above by the GPU type's per-cloud maximum (GpuType.maxCount);
|
|
1736
|
+
description: "Number of GPUs on each pod. Bounded above by the GPU type's per-cloud maximum (GpuType.maxCount); values beyond it are rejected.",
|
|
1632
1737
|
examples: [8]
|
|
1633
1738
|
},
|
|
1634
1739
|
podCount: {
|
|
@@ -1641,7 +1746,7 @@ var generatedTools = [
|
|
|
1641
1746
|
}
|
|
1642
1747
|
},
|
|
1643
1748
|
ClusterMounts: {
|
|
1644
|
-
description: "Storage mounts for a cluster create: `persistent` or `network
|
|
1749
|
+
description: "Storage mounts for a cluster create: `persistent` or one `network` volume, not both. Clusters cannot mount global volumes, so `global` is rejected.",
|
|
1645
1750
|
"x-go-type": "BaseMounts",
|
|
1646
1751
|
allOf: [
|
|
1647
1752
|
{
|
|
@@ -1661,6 +1766,7 @@ var generatedTools = [
|
|
|
1661
1766
|
},
|
|
1662
1767
|
network: {
|
|
1663
1768
|
type: "array",
|
|
1769
|
+
maxItems: 1,
|
|
1664
1770
|
items: {
|
|
1665
1771
|
type: "object",
|
|
1666
1772
|
properties: {
|
|
@@ -1739,7 +1845,7 @@ var generatedTools = [
|
|
|
1739
1845
|
type: "object",
|
|
1740
1846
|
required: ["volumeId", "path"],
|
|
1741
1847
|
additionalProperties: false,
|
|
1742
|
-
description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods.
|
|
1848
|
+
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`).",
|
|
1743
1849
|
properties: {
|
|
1744
1850
|
volumeId: {
|
|
1745
1851
|
type: "string",
|
|
@@ -1762,7 +1868,7 @@ var generatedTools = [
|
|
|
1762
1868
|
size: {
|
|
1763
1869
|
type: "integer",
|
|
1764
1870
|
minimum: 10,
|
|
1765
|
-
description: "Host-local persistent storage in GB.
|
|
1871
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
1766
1872
|
examples: [20]
|
|
1767
1873
|
},
|
|
1768
1874
|
path: {
|
|
@@ -1775,6 +1881,77 @@ var generatedTools = [
|
|
|
1775
1881
|
}
|
|
1776
1882
|
}
|
|
1777
1883
|
},
|
|
1884
|
+
{
|
|
1885
|
+
name: "create-cost-center",
|
|
1886
|
+
title: "Create cost center",
|
|
1887
|
+
operationId: "createCostCenter",
|
|
1888
|
+
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.",
|
|
1889
|
+
method: "POST",
|
|
1890
|
+
path: "/v2/cost-centers",
|
|
1891
|
+
params: [],
|
|
1892
|
+
hasBody: true,
|
|
1893
|
+
annotations: {
|
|
1894
|
+
readOnlyHint: false,
|
|
1895
|
+
destructiveHint: false,
|
|
1896
|
+
idempotentHint: false,
|
|
1897
|
+
openWorldHint: true
|
|
1898
|
+
},
|
|
1899
|
+
inputSchema: {
|
|
1900
|
+
type: "object",
|
|
1901
|
+
properties: {
|
|
1902
|
+
body: {
|
|
1903
|
+
$ref: "#/$defs/CreateCostCenterRequest",
|
|
1904
|
+
type: "object"
|
|
1905
|
+
}
|
|
1906
|
+
},
|
|
1907
|
+
required: ["body"],
|
|
1908
|
+
$defs: {
|
|
1909
|
+
CostCenterResource: {
|
|
1910
|
+
type: "object",
|
|
1911
|
+
additionalProperties: false,
|
|
1912
|
+
required: ["id", "type"],
|
|
1913
|
+
properties: {
|
|
1914
|
+
id: {
|
|
1915
|
+
type: "string",
|
|
1916
|
+
minLength: 1,
|
|
1917
|
+
examples: ["p9k2m4n6q8"]
|
|
1918
|
+
},
|
|
1919
|
+
type: {
|
|
1920
|
+
$ref: "#/$defs/ResourceType"
|
|
1921
|
+
}
|
|
1922
|
+
}
|
|
1923
|
+
},
|
|
1924
|
+
CreateCostCenterRequest: {
|
|
1925
|
+
type: "object",
|
|
1926
|
+
additionalProperties: false,
|
|
1927
|
+
required: ["value"],
|
|
1928
|
+
properties: {
|
|
1929
|
+
value: {
|
|
1930
|
+
type: "string",
|
|
1931
|
+
minLength: 1,
|
|
1932
|
+
maxLength: 50,
|
|
1933
|
+
pattern: "^\\s*\\S",
|
|
1934
|
+
description: "Leading and trailing whitespace is trimmed.",
|
|
1935
|
+
examples: ["team-ml"]
|
|
1936
|
+
},
|
|
1937
|
+
resources: {
|
|
1938
|
+
type: "array",
|
|
1939
|
+
description: "Resources to attribute to the new cost center.",
|
|
1940
|
+
maxItems: 100,
|
|
1941
|
+
items: {
|
|
1942
|
+
$ref: "#/$defs/CostCenterResource"
|
|
1943
|
+
}
|
|
1944
|
+
}
|
|
1945
|
+
}
|
|
1946
|
+
},
|
|
1947
|
+
ResourceType: {
|
|
1948
|
+
type: "string",
|
|
1949
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
1950
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1953
|
+
}
|
|
1954
|
+
},
|
|
1778
1955
|
{
|
|
1779
1956
|
name: "create-delegation",
|
|
1780
1957
|
title: "Create ECR delegation",
|
|
@@ -2303,6 +2480,7 @@ var generatedTools = [
|
|
|
2303
2480
|
type: "string",
|
|
2304
2481
|
minLength: 1,
|
|
2305
2482
|
maxLength: 191,
|
|
2483
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
2306
2484
|
description: "Human-readable name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed.",
|
|
2307
2485
|
examples: ["training-data"]
|
|
2308
2486
|
}
|
|
@@ -2378,6 +2556,169 @@ var generatedTools = [
|
|
|
2378
2556
|
}
|
|
2379
2557
|
}
|
|
2380
2558
|
},
|
|
2559
|
+
{
|
|
2560
|
+
name: "create-organization-group",
|
|
2561
|
+
title: "Create organization group",
|
|
2562
|
+
operationId: "createOrganizationGroup",
|
|
2563
|
+
description: "Create a group in your current organization",
|
|
2564
|
+
method: "POST",
|
|
2565
|
+
path: "/v2/organization/groups",
|
|
2566
|
+
params: [],
|
|
2567
|
+
hasBody: true,
|
|
2568
|
+
annotations: {
|
|
2569
|
+
readOnlyHint: false,
|
|
2570
|
+
destructiveHint: false,
|
|
2571
|
+
idempotentHint: false,
|
|
2572
|
+
openWorldHint: true
|
|
2573
|
+
},
|
|
2574
|
+
inputSchema: {
|
|
2575
|
+
type: "object",
|
|
2576
|
+
properties: {
|
|
2577
|
+
body: {
|
|
2578
|
+
$ref: "#/$defs/CreateOrganizationGroupRequest",
|
|
2579
|
+
type: "object"
|
|
2580
|
+
}
|
|
2581
|
+
},
|
|
2582
|
+
required: ["body"],
|
|
2583
|
+
$defs: {
|
|
2584
|
+
CreateOrganizationGroupRequest: {
|
|
2585
|
+
type: "object",
|
|
2586
|
+
additionalProperties: false,
|
|
2587
|
+
required: ["name"],
|
|
2588
|
+
properties: {
|
|
2589
|
+
name: {
|
|
2590
|
+
type: "string",
|
|
2591
|
+
minLength: 1,
|
|
2592
|
+
maxLength: 191,
|
|
2593
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
2594
|
+
description: "Group name with at least one non-whitespace character; surrounding whitespace is trimmed.",
|
|
2595
|
+
examples: ["Engineering"]
|
|
2596
|
+
}
|
|
2597
|
+
}
|
|
2598
|
+
}
|
|
2599
|
+
}
|
|
2600
|
+
}
|
|
2601
|
+
},
|
|
2602
|
+
{
|
|
2603
|
+
name: "create-organization-invite",
|
|
2604
|
+
title: "Create organization invite",
|
|
2605
|
+
operationId: "createOrganizationInvite",
|
|
2606
|
+
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.",
|
|
2607
|
+
method: "POST",
|
|
2608
|
+
path: "/v2/organization/invites",
|
|
2609
|
+
params: [],
|
|
2610
|
+
hasBody: true,
|
|
2611
|
+
annotations: {
|
|
2612
|
+
readOnlyHint: false,
|
|
2613
|
+
destructiveHint: false,
|
|
2614
|
+
idempotentHint: false,
|
|
2615
|
+
openWorldHint: true
|
|
2616
|
+
},
|
|
2617
|
+
inputSchema: {
|
|
2618
|
+
type: "object",
|
|
2619
|
+
properties: {
|
|
2620
|
+
body: {
|
|
2621
|
+
$ref: "#/$defs/CreateOrganizationInviteRequest",
|
|
2622
|
+
type: "object"
|
|
2623
|
+
}
|
|
2624
|
+
},
|
|
2625
|
+
required: ["body"],
|
|
2626
|
+
$defs: {
|
|
2627
|
+
CreateOrganizationInviteRequest: {
|
|
2628
|
+
type: "object",
|
|
2629
|
+
additionalProperties: false,
|
|
2630
|
+
required: ["email", "role"],
|
|
2631
|
+
properties: {
|
|
2632
|
+
email: {
|
|
2633
|
+
type: "string",
|
|
2634
|
+
format: "email",
|
|
2635
|
+
minLength: 1,
|
|
2636
|
+
maxLength: 254,
|
|
2637
|
+
description: "Address to invite, stored lowercased. The invitee accepts by signing in with a verified account on this address.",
|
|
2638
|
+
examples: ["new-member@example.com"]
|
|
2639
|
+
},
|
|
2640
|
+
role: {
|
|
2641
|
+
$ref: "#/$defs/OrganizationRoleInput"
|
|
2642
|
+
}
|
|
2643
|
+
}
|
|
2644
|
+
},
|
|
2645
|
+
OrganizationRoleInput: {
|
|
2646
|
+
type: "object",
|
|
2647
|
+
description: "An organization role to assign, by ID.",
|
|
2648
|
+
additionalProperties: false,
|
|
2649
|
+
required: ["id"],
|
|
2650
|
+
properties: {
|
|
2651
|
+
id: {
|
|
2652
|
+
type: "string",
|
|
2653
|
+
minLength: 1,
|
|
2654
|
+
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.",
|
|
2655
|
+
examples: ["builtin:dev"]
|
|
2656
|
+
}
|
|
2657
|
+
}
|
|
2658
|
+
}
|
|
2659
|
+
}
|
|
2660
|
+
}
|
|
2661
|
+
},
|
|
2662
|
+
{
|
|
2663
|
+
name: "create-organization-role",
|
|
2664
|
+
title: "Create organization role",
|
|
2665
|
+
operationId: "createOrganizationRole",
|
|
2666
|
+
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.",
|
|
2667
|
+
method: "POST",
|
|
2668
|
+
path: "/v2/organization/roles",
|
|
2669
|
+
params: [],
|
|
2670
|
+
hasBody: true,
|
|
2671
|
+
annotations: {
|
|
2672
|
+
readOnlyHint: false,
|
|
2673
|
+
destructiveHint: false,
|
|
2674
|
+
idempotentHint: false,
|
|
2675
|
+
openWorldHint: true
|
|
2676
|
+
},
|
|
2677
|
+
inputSchema: {
|
|
2678
|
+
type: "object",
|
|
2679
|
+
properties: {
|
|
2680
|
+
body: {
|
|
2681
|
+
$ref: "#/$defs/CreateOrganizationRoleRequest",
|
|
2682
|
+
type: "object"
|
|
2683
|
+
}
|
|
2684
|
+
},
|
|
2685
|
+
required: ["body"],
|
|
2686
|
+
$defs: {
|
|
2687
|
+
CreateOrganizationRoleRequest: {
|
|
2688
|
+
type: "object",
|
|
2689
|
+
additionalProperties: false,
|
|
2690
|
+
required: ["name", "capabilities"],
|
|
2691
|
+
properties: {
|
|
2692
|
+
name: {
|
|
2693
|
+
$ref: "#/$defs/OrganizationRoleName"
|
|
2694
|
+
},
|
|
2695
|
+
capabilities: {
|
|
2696
|
+
$ref: "#/$defs/OrganizationRoleCapabilitiesInput"
|
|
2697
|
+
}
|
|
2698
|
+
}
|
|
2699
|
+
},
|
|
2700
|
+
OrganizationRoleCapabilitiesInput: {
|
|
2701
|
+
type: "array",
|
|
2702
|
+
description: "What the role grants, as `FAMILY:VERB` capabilities from `get-organization-role-capabilities`. The caller must hold every capability it lists.",
|
|
2703
|
+
minItems: 1,
|
|
2704
|
+
uniqueItems: true,
|
|
2705
|
+
items: {
|
|
2706
|
+
type: "string",
|
|
2707
|
+
pattern: "^[A-Z0-9_]+:[A-Z0-9_]+$"
|
|
2708
|
+
},
|
|
2709
|
+
examples: [["POD:VIEW"]]
|
|
2710
|
+
},
|
|
2711
|
+
OrganizationRoleName: {
|
|
2712
|
+
type: "string",
|
|
2713
|
+
minLength: 1,
|
|
2714
|
+
maxLength: 191,
|
|
2715
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
2716
|
+
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.",
|
|
2717
|
+
examples: ["Pod viewer"]
|
|
2718
|
+
}
|
|
2719
|
+
}
|
|
2720
|
+
}
|
|
2721
|
+
},
|
|
2381
2722
|
{
|
|
2382
2723
|
name: "create-pod",
|
|
2383
2724
|
title: "Create Pod",
|
|
@@ -2498,6 +2839,7 @@ var generatedTools = [
|
|
|
2498
2839
|
count: {
|
|
2499
2840
|
type: "integer",
|
|
2500
2841
|
minimum: 1,
|
|
2842
|
+
maximum: 1024,
|
|
2501
2843
|
default: 1,
|
|
2502
2844
|
description: "Number of GPUs",
|
|
2503
2845
|
examples: [1]
|
|
@@ -2512,7 +2854,6 @@ var generatedTools = [
|
|
|
2512
2854
|
},
|
|
2513
2855
|
network: {
|
|
2514
2856
|
type: "array",
|
|
2515
|
-
maxItems: 1,
|
|
2516
2857
|
items: {
|
|
2517
2858
|
$ref: "#/$defs/NetworkMount"
|
|
2518
2859
|
}
|
|
@@ -2576,12 +2917,14 @@ var generatedTools = [
|
|
|
2576
2917
|
minRamPerGpu: {
|
|
2577
2918
|
type: "integer",
|
|
2578
2919
|
minimum: 1,
|
|
2920
|
+
maximum: 65536,
|
|
2579
2921
|
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.",
|
|
2580
2922
|
examples: [8]
|
|
2581
2923
|
},
|
|
2582
2924
|
minVcpuCountPerGpu: {
|
|
2583
2925
|
type: "integer",
|
|
2584
2926
|
minimum: 1,
|
|
2927
|
+
maximum: 4096,
|
|
2585
2928
|
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.",
|
|
2586
2929
|
examples: [2]
|
|
2587
2930
|
}
|
|
@@ -2672,7 +3015,7 @@ var generatedTools = [
|
|
|
2672
3015
|
type: "object",
|
|
2673
3016
|
required: ["volumeId"],
|
|
2674
3017
|
additionalProperties: false,
|
|
2675
|
-
description: "Reference to a GlobalVolume. Usage-billed, so it has no size.
|
|
3018
|
+
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`).",
|
|
2676
3019
|
properties: {
|
|
2677
3020
|
volumeId: {
|
|
2678
3021
|
type: "string",
|
|
@@ -2681,7 +3024,7 @@ var generatedTools = [
|
|
|
2681
3024
|
},
|
|
2682
3025
|
path: {
|
|
2683
3026
|
type: "string",
|
|
2684
|
-
description: "Mount path inside the container. Optional
|
|
3027
|
+
description: "Mount path inside the container. Optional; a default is chosen for you when omitted.",
|
|
2685
3028
|
examples: ["/data"]
|
|
2686
3029
|
}
|
|
2687
3030
|
}
|
|
@@ -2695,10 +3038,18 @@ var generatedTools = [
|
|
|
2695
3038
|
{
|
|
2696
3039
|
type: "object",
|
|
2697
3040
|
properties: {
|
|
3041
|
+
network: {
|
|
3042
|
+
type: "array",
|
|
3043
|
+
maxItems: 4,
|
|
3044
|
+
description: "Up to 4 network volumes, all in the pod's data center.",
|
|
3045
|
+
items: {
|
|
3046
|
+
$ref: "#/$defs/NetworkMount"
|
|
3047
|
+
}
|
|
3048
|
+
},
|
|
2698
3049
|
global: {
|
|
2699
3050
|
type: "array",
|
|
2700
3051
|
maxItems: 1,
|
|
2701
|
-
description: "At most one global volume, on GPU and CPU pods, with no data center constraint. Combinable with `network` but not with `persistent` (rejected):
|
|
3052
|
+
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`.",
|
|
2702
3053
|
items: {
|
|
2703
3054
|
$ref: "#/$defs/GlobalMount"
|
|
2704
3055
|
}
|
|
@@ -2712,7 +3063,7 @@ var generatedTools = [
|
|
|
2712
3063
|
type: "object",
|
|
2713
3064
|
required: ["volumeId", "path"],
|
|
2714
3065
|
additionalProperties: false,
|
|
2715
|
-
description: "Reference to a NetworkVolume. Custom paths are honored at runtime on both GPU and CPU pods.
|
|
3066
|
+
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`).",
|
|
2716
3067
|
properties: {
|
|
2717
3068
|
volumeId: {
|
|
2718
3069
|
type: "string",
|
|
@@ -2735,7 +3086,7 @@ var generatedTools = [
|
|
|
2735
3086
|
size: {
|
|
2736
3087
|
type: "integer",
|
|
2737
3088
|
minimum: 10,
|
|
2738
|
-
description: "Host-local persistent storage in GB.
|
|
3089
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
2739
3090
|
examples: [20]
|
|
2740
3091
|
},
|
|
2741
3092
|
path: {
|
|
@@ -3032,7 +3383,7 @@ var generatedTools = [
|
|
|
3032
3383
|
size: {
|
|
3033
3384
|
type: "integer",
|
|
3034
3385
|
minimum: 10,
|
|
3035
|
-
description: "Host-local persistent storage in GB.
|
|
3386
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
3036
3387
|
examples: [20]
|
|
3037
3388
|
},
|
|
3038
3389
|
path: {
|
|
@@ -3093,13 +3444,12 @@ var generatedTools = [
|
|
|
3093
3444
|
}
|
|
3094
3445
|
},
|
|
3095
3446
|
{
|
|
3096
|
-
name: "delete-
|
|
3097
|
-
title: "Delete
|
|
3098
|
-
operationId: "
|
|
3099
|
-
description: "Delete a
|
|
3100
|
-
directoryDescription: "Delete a Serverless endpoint permanently and immediately.",
|
|
3447
|
+
name: "delete-cost-center",
|
|
3448
|
+
title: "Delete cost center",
|
|
3449
|
+
operationId: "deleteCostCenter",
|
|
3450
|
+
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.",
|
|
3101
3451
|
method: "DELETE",
|
|
3102
|
-
path: "/v2/
|
|
3452
|
+
path: "/v2/cost-centers/{id}",
|
|
3103
3453
|
params: [
|
|
3104
3454
|
{
|
|
3105
3455
|
name: "id",
|
|
@@ -3118,17 +3468,50 @@ var generatedTools = [
|
|
|
3118
3468
|
properties: {
|
|
3119
3469
|
id: {
|
|
3120
3470
|
type: "string",
|
|
3121
|
-
|
|
3471
|
+
minLength: 1,
|
|
3472
|
+
description: "Cost center identifier."
|
|
3122
3473
|
}
|
|
3123
3474
|
},
|
|
3124
3475
|
required: ["id"]
|
|
3125
3476
|
}
|
|
3126
3477
|
},
|
|
3127
3478
|
{
|
|
3128
|
-
name: "delete-
|
|
3129
|
-
title: "Delete
|
|
3130
|
-
operationId: "
|
|
3131
|
-
description: "Delete a
|
|
3479
|
+
name: "delete-endpoint",
|
|
3480
|
+
title: "Delete endpoint",
|
|
3481
|
+
operationId: "deleteEndpoint",
|
|
3482
|
+
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.",
|
|
3483
|
+
directoryDescription: "Delete a Serverless endpoint permanently and immediately.",
|
|
3484
|
+
method: "DELETE",
|
|
3485
|
+
path: "/v2/serverless/{id}",
|
|
3486
|
+
params: [
|
|
3487
|
+
{
|
|
3488
|
+
name: "id",
|
|
3489
|
+
location: "path"
|
|
3490
|
+
}
|
|
3491
|
+
],
|
|
3492
|
+
hasBody: false,
|
|
3493
|
+
annotations: {
|
|
3494
|
+
readOnlyHint: false,
|
|
3495
|
+
destructiveHint: true,
|
|
3496
|
+
idempotentHint: true,
|
|
3497
|
+
openWorldHint: true
|
|
3498
|
+
},
|
|
3499
|
+
inputSchema: {
|
|
3500
|
+
type: "object",
|
|
3501
|
+
properties: {
|
|
3502
|
+
id: {
|
|
3503
|
+
type: "string",
|
|
3504
|
+
description: "Serverless endpoint identifier"
|
|
3505
|
+
}
|
|
3506
|
+
},
|
|
3507
|
+
required: ["id"]
|
|
3508
|
+
}
|
|
3509
|
+
},
|
|
3510
|
+
{
|
|
3511
|
+
name: "delete-global-volume",
|
|
3512
|
+
title: "Delete global volume",
|
|
3513
|
+
operationId: "deleteGlobalVolume",
|
|
3514
|
+
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.",
|
|
3132
3515
|
method: "DELETE",
|
|
3133
3516
|
path: "/v2/global-volumes/{id}",
|
|
3134
3517
|
params: [
|
|
@@ -3186,6 +3569,131 @@ var generatedTools = [
|
|
|
3186
3569
|
required: ["id"]
|
|
3187
3570
|
}
|
|
3188
3571
|
},
|
|
3572
|
+
{
|
|
3573
|
+
name: "delete-organization-group",
|
|
3574
|
+
title: "Delete organization group",
|
|
3575
|
+
operationId: "deleteOrganizationGroup",
|
|
3576
|
+
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.",
|
|
3577
|
+
method: "DELETE",
|
|
3578
|
+
path: "/v2/organization/groups/{id}",
|
|
3579
|
+
params: [
|
|
3580
|
+
{
|
|
3581
|
+
name: "id",
|
|
3582
|
+
location: "path"
|
|
3583
|
+
}
|
|
3584
|
+
],
|
|
3585
|
+
hasBody: false,
|
|
3586
|
+
annotations: {
|
|
3587
|
+
readOnlyHint: false,
|
|
3588
|
+
destructiveHint: true,
|
|
3589
|
+
idempotentHint: true,
|
|
3590
|
+
openWorldHint: true
|
|
3591
|
+
},
|
|
3592
|
+
inputSchema: {
|
|
3593
|
+
type: "object",
|
|
3594
|
+
properties: {
|
|
3595
|
+
id: {
|
|
3596
|
+
type: "string",
|
|
3597
|
+
minLength: 1,
|
|
3598
|
+
description: "Group ID."
|
|
3599
|
+
}
|
|
3600
|
+
},
|
|
3601
|
+
required: ["id"]
|
|
3602
|
+
}
|
|
3603
|
+
},
|
|
3604
|
+
{
|
|
3605
|
+
name: "delete-organization-invite",
|
|
3606
|
+
title: "Delete organization invite",
|
|
3607
|
+
operationId: "deleteOrganizationInvite",
|
|
3608
|
+
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.",
|
|
3609
|
+
method: "DELETE",
|
|
3610
|
+
path: "/v2/organization/invites/{id}",
|
|
3611
|
+
params: [
|
|
3612
|
+
{
|
|
3613
|
+
name: "id",
|
|
3614
|
+
location: "path"
|
|
3615
|
+
}
|
|
3616
|
+
],
|
|
3617
|
+
hasBody: false,
|
|
3618
|
+
annotations: {
|
|
3619
|
+
readOnlyHint: false,
|
|
3620
|
+
destructiveHint: true,
|
|
3621
|
+
idempotentHint: true,
|
|
3622
|
+
openWorldHint: true
|
|
3623
|
+
},
|
|
3624
|
+
inputSchema: {
|
|
3625
|
+
type: "object",
|
|
3626
|
+
properties: {
|
|
3627
|
+
id: {
|
|
3628
|
+
type: "string",
|
|
3629
|
+
description: "Invite identifier"
|
|
3630
|
+
}
|
|
3631
|
+
},
|
|
3632
|
+
required: ["id"]
|
|
3633
|
+
}
|
|
3634
|
+
},
|
|
3635
|
+
{
|
|
3636
|
+
name: "delete-organization-role",
|
|
3637
|
+
title: "Delete organization role",
|
|
3638
|
+
operationId: "deleteOrganizationRole",
|
|
3639
|
+
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.",
|
|
3640
|
+
method: "DELETE",
|
|
3641
|
+
path: "/v2/organization/roles/{id}",
|
|
3642
|
+
params: [
|
|
3643
|
+
{
|
|
3644
|
+
name: "id",
|
|
3645
|
+
location: "path"
|
|
3646
|
+
}
|
|
3647
|
+
],
|
|
3648
|
+
hasBody: false,
|
|
3649
|
+
annotations: {
|
|
3650
|
+
readOnlyHint: false,
|
|
3651
|
+
destructiveHint: true,
|
|
3652
|
+
idempotentHint: true,
|
|
3653
|
+
openWorldHint: true
|
|
3654
|
+
},
|
|
3655
|
+
inputSchema: {
|
|
3656
|
+
type: "object",
|
|
3657
|
+
properties: {
|
|
3658
|
+
id: {
|
|
3659
|
+
type: "string",
|
|
3660
|
+
description: "Role identifier"
|
|
3661
|
+
}
|
|
3662
|
+
},
|
|
3663
|
+
required: ["id"]
|
|
3664
|
+
}
|
|
3665
|
+
},
|
|
3666
|
+
{
|
|
3667
|
+
name: "delete-organization-user",
|
|
3668
|
+
title: "Delete organization user",
|
|
3669
|
+
operationId: "deleteOrganizationUser",
|
|
3670
|
+
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.",
|
|
3671
|
+
method: "DELETE",
|
|
3672
|
+
path: "/v2/organization/users/{id}",
|
|
3673
|
+
params: [
|
|
3674
|
+
{
|
|
3675
|
+
name: "id",
|
|
3676
|
+
location: "path"
|
|
3677
|
+
}
|
|
3678
|
+
],
|
|
3679
|
+
hasBody: false,
|
|
3680
|
+
annotations: {
|
|
3681
|
+
readOnlyHint: false,
|
|
3682
|
+
destructiveHint: true,
|
|
3683
|
+
idempotentHint: true,
|
|
3684
|
+
openWorldHint: true
|
|
3685
|
+
},
|
|
3686
|
+
inputSchema: {
|
|
3687
|
+
type: "object",
|
|
3688
|
+
properties: {
|
|
3689
|
+
id: {
|
|
3690
|
+
type: "string",
|
|
3691
|
+
description: "User identifier"
|
|
3692
|
+
}
|
|
3693
|
+
},
|
|
3694
|
+
required: ["id"]
|
|
3695
|
+
}
|
|
3696
|
+
},
|
|
3189
3697
|
{
|
|
3190
3698
|
name: "delete-pod",
|
|
3191
3699
|
title: "Delete Pod",
|
|
@@ -3311,6 +3819,63 @@ var generatedTools = [
|
|
|
3311
3819
|
required: ["id"]
|
|
3312
3820
|
}
|
|
3313
3821
|
},
|
|
3822
|
+
{
|
|
3823
|
+
name: "detach-cost-center-resource",
|
|
3824
|
+
title: "Detach cost center resource",
|
|
3825
|
+
operationId: "detachCostCenterResource",
|
|
3826
|
+
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.",
|
|
3827
|
+
method: "DELETE",
|
|
3828
|
+
path: "/v2/cost-centers/{id}/{resourceType}/{resourceId}",
|
|
3829
|
+
params: [
|
|
3830
|
+
{
|
|
3831
|
+
name: "id",
|
|
3832
|
+
location: "path"
|
|
3833
|
+
},
|
|
3834
|
+
{
|
|
3835
|
+
name: "resourceType",
|
|
3836
|
+
location: "path"
|
|
3837
|
+
},
|
|
3838
|
+
{
|
|
3839
|
+
name: "resourceId",
|
|
3840
|
+
location: "path"
|
|
3841
|
+
}
|
|
3842
|
+
],
|
|
3843
|
+
hasBody: false,
|
|
3844
|
+
annotations: {
|
|
3845
|
+
readOnlyHint: false,
|
|
3846
|
+
destructiveHint: true,
|
|
3847
|
+
idempotentHint: true,
|
|
3848
|
+
openWorldHint: true
|
|
3849
|
+
},
|
|
3850
|
+
inputSchema: {
|
|
3851
|
+
type: "object",
|
|
3852
|
+
properties: {
|
|
3853
|
+
id: {
|
|
3854
|
+
type: "string",
|
|
3855
|
+
minLength: 1,
|
|
3856
|
+
description: "Cost center identifier."
|
|
3857
|
+
},
|
|
3858
|
+
resourceType: {
|
|
3859
|
+
$ref: "#/$defs/ResourceType",
|
|
3860
|
+
description: "Kind of resource.",
|
|
3861
|
+
type: "string"
|
|
3862
|
+
},
|
|
3863
|
+
resourceId: {
|
|
3864
|
+
type: "string",
|
|
3865
|
+
minLength: 1,
|
|
3866
|
+
description: "Resource identifier."
|
|
3867
|
+
}
|
|
3868
|
+
},
|
|
3869
|
+
required: ["id", "resourceType", "resourceId"],
|
|
3870
|
+
$defs: {
|
|
3871
|
+
ResourceType: {
|
|
3872
|
+
type: "string",
|
|
3873
|
+
description: "Kind of resource a cost center or tag can be attached to.",
|
|
3874
|
+
enum: ["POD", "CLUSTER", "SERVERLESS_ENDPOINT", "NETWORK_VOLUME"]
|
|
3875
|
+
}
|
|
3876
|
+
}
|
|
3877
|
+
}
|
|
3878
|
+
},
|
|
3314
3879
|
{
|
|
3315
3880
|
name: "get-cluster",
|
|
3316
3881
|
title: "Get cluster",
|
|
@@ -3342,6 +3907,38 @@ var generatedTools = [
|
|
|
3342
3907
|
required: ["id"]
|
|
3343
3908
|
}
|
|
3344
3909
|
},
|
|
3910
|
+
{
|
|
3911
|
+
name: "get-cost-center",
|
|
3912
|
+
title: "Get cost center",
|
|
3913
|
+
operationId: "getCostCenter",
|
|
3914
|
+
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.",
|
|
3915
|
+
method: "GET",
|
|
3916
|
+
path: "/v2/cost-centers/{id}",
|
|
3917
|
+
params: [
|
|
3918
|
+
{
|
|
3919
|
+
name: "id",
|
|
3920
|
+
location: "path"
|
|
3921
|
+
}
|
|
3922
|
+
],
|
|
3923
|
+
hasBody: false,
|
|
3924
|
+
annotations: {
|
|
3925
|
+
readOnlyHint: true,
|
|
3926
|
+
destructiveHint: false,
|
|
3927
|
+
idempotentHint: true,
|
|
3928
|
+
openWorldHint: true
|
|
3929
|
+
},
|
|
3930
|
+
inputSchema: {
|
|
3931
|
+
type: "object",
|
|
3932
|
+
properties: {
|
|
3933
|
+
id: {
|
|
3934
|
+
type: "string",
|
|
3935
|
+
minLength: 1,
|
|
3936
|
+
description: "Cost center identifier."
|
|
3937
|
+
}
|
|
3938
|
+
},
|
|
3939
|
+
required: ["id"]
|
|
3940
|
+
}
|
|
3941
|
+
},
|
|
3345
3942
|
{
|
|
3346
3943
|
name: "get-cpu-type",
|
|
3347
3944
|
title: "Get CPU type",
|
|
@@ -3539,6 +4136,261 @@ var generatedTools = [
|
|
|
3539
4136
|
required: ["id", "buildId"]
|
|
3540
4137
|
}
|
|
3541
4138
|
},
|
|
4139
|
+
{
|
|
4140
|
+
name: "get-endpoint-cold-start-metrics",
|
|
4141
|
+
title: "Get endpoint cold start metrics",
|
|
4142
|
+
operationId: "getEndpointColdStartMetrics",
|
|
4143
|
+
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.",
|
|
4144
|
+
method: "GET",
|
|
4145
|
+
path: "/v2/serverless/{id}/metrics/cold-starts",
|
|
4146
|
+
params: [
|
|
4147
|
+
{
|
|
4148
|
+
name: "id",
|
|
4149
|
+
location: "path"
|
|
4150
|
+
},
|
|
4151
|
+
{
|
|
4152
|
+
name: "startTime",
|
|
4153
|
+
location: "query"
|
|
4154
|
+
},
|
|
4155
|
+
{
|
|
4156
|
+
name: "endTime",
|
|
4157
|
+
location: "query"
|
|
4158
|
+
},
|
|
4159
|
+
{
|
|
4160
|
+
name: "interval",
|
|
4161
|
+
location: "query"
|
|
4162
|
+
},
|
|
4163
|
+
{
|
|
4164
|
+
name: "cursor",
|
|
4165
|
+
location: "query"
|
|
4166
|
+
},
|
|
4167
|
+
{
|
|
4168
|
+
name: "limit",
|
|
4169
|
+
location: "query"
|
|
4170
|
+
}
|
|
4171
|
+
],
|
|
4172
|
+
hasBody: false,
|
|
4173
|
+
annotations: {
|
|
4174
|
+
readOnlyHint: true,
|
|
4175
|
+
destructiveHint: false,
|
|
4176
|
+
idempotentHint: true,
|
|
4177
|
+
openWorldHint: true
|
|
4178
|
+
},
|
|
4179
|
+
inputSchema: {
|
|
4180
|
+
type: "object",
|
|
4181
|
+
properties: {
|
|
4182
|
+
id: {
|
|
4183
|
+
type: "string",
|
|
4184
|
+
description: "Serverless endpoint identifier"
|
|
4185
|
+
},
|
|
4186
|
+
startTime: {
|
|
4187
|
+
type: "string",
|
|
4188
|
+
format: "date-time",
|
|
4189
|
+
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."
|
|
4190
|
+
},
|
|
4191
|
+
endTime: {
|
|
4192
|
+
type: "string",
|
|
4193
|
+
format: "date-time",
|
|
4194
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
4195
|
+
},
|
|
4196
|
+
interval: {
|
|
4197
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
4198
|
+
description: "Bucket size. Defaults to 1h.",
|
|
4199
|
+
type: "string"
|
|
4200
|
+
},
|
|
4201
|
+
cursor: {
|
|
4202
|
+
type: "string",
|
|
4203
|
+
minLength: 1,
|
|
4204
|
+
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."
|
|
4205
|
+
},
|
|
4206
|
+
limit: {
|
|
4207
|
+
type: "integer",
|
|
4208
|
+
minimum: 1,
|
|
4209
|
+
maximum: 1e3,
|
|
4210
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
4211
|
+
}
|
|
4212
|
+
},
|
|
4213
|
+
required: ["id"],
|
|
4214
|
+
$defs: {
|
|
4215
|
+
EndpointMetricsInterval: {
|
|
4216
|
+
type: "string",
|
|
4217
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
4218
|
+
default: "1h",
|
|
4219
|
+
description: "Bucket size for endpoint metrics."
|
|
4220
|
+
}
|
|
4221
|
+
}
|
|
4222
|
+
}
|
|
4223
|
+
},
|
|
4224
|
+
{
|
|
4225
|
+
name: "get-endpoint-request-metrics",
|
|
4226
|
+
title: "Get endpoint request metrics",
|
|
4227
|
+
operationId: "getEndpointRequestMetrics",
|
|
4228
|
+
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.",
|
|
4229
|
+
method: "GET",
|
|
4230
|
+
path: "/v2/serverless/{id}/metrics/requests",
|
|
4231
|
+
params: [
|
|
4232
|
+
{
|
|
4233
|
+
name: "id",
|
|
4234
|
+
location: "path"
|
|
4235
|
+
},
|
|
4236
|
+
{
|
|
4237
|
+
name: "startTime",
|
|
4238
|
+
location: "query"
|
|
4239
|
+
},
|
|
4240
|
+
{
|
|
4241
|
+
name: "endTime",
|
|
4242
|
+
location: "query"
|
|
4243
|
+
},
|
|
4244
|
+
{
|
|
4245
|
+
name: "interval",
|
|
4246
|
+
location: "query"
|
|
4247
|
+
},
|
|
4248
|
+
{
|
|
4249
|
+
name: "cursor",
|
|
4250
|
+
location: "query"
|
|
4251
|
+
},
|
|
4252
|
+
{
|
|
4253
|
+
name: "limit",
|
|
4254
|
+
location: "query"
|
|
4255
|
+
}
|
|
4256
|
+
],
|
|
4257
|
+
hasBody: false,
|
|
4258
|
+
annotations: {
|
|
4259
|
+
readOnlyHint: true,
|
|
4260
|
+
destructiveHint: false,
|
|
4261
|
+
idempotentHint: true,
|
|
4262
|
+
openWorldHint: true
|
|
4263
|
+
},
|
|
4264
|
+
inputSchema: {
|
|
4265
|
+
type: "object",
|
|
4266
|
+
properties: {
|
|
4267
|
+
id: {
|
|
4268
|
+
type: "string",
|
|
4269
|
+
description: "Serverless endpoint identifier"
|
|
4270
|
+
},
|
|
4271
|
+
startTime: {
|
|
4272
|
+
type: "string",
|
|
4273
|
+
format: "date-time",
|
|
4274
|
+
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."
|
|
4275
|
+
},
|
|
4276
|
+
endTime: {
|
|
4277
|
+
type: "string",
|
|
4278
|
+
format: "date-time",
|
|
4279
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
4280
|
+
},
|
|
4281
|
+
interval: {
|
|
4282
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
4283
|
+
description: "Bucket size. Defaults to 1h.",
|
|
4284
|
+
type: "string"
|
|
4285
|
+
},
|
|
4286
|
+
cursor: {
|
|
4287
|
+
type: "string",
|
|
4288
|
+
minLength: 1,
|
|
4289
|
+
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."
|
|
4290
|
+
},
|
|
4291
|
+
limit: {
|
|
4292
|
+
type: "integer",
|
|
4293
|
+
minimum: 1,
|
|
4294
|
+
maximum: 1e3,
|
|
4295
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
4296
|
+
}
|
|
4297
|
+
},
|
|
4298
|
+
required: ["id"],
|
|
4299
|
+
$defs: {
|
|
4300
|
+
EndpointMetricsInterval: {
|
|
4301
|
+
type: "string",
|
|
4302
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
4303
|
+
default: "1h",
|
|
4304
|
+
description: "Bucket size for endpoint metrics."
|
|
4305
|
+
}
|
|
4306
|
+
}
|
|
4307
|
+
}
|
|
4308
|
+
},
|
|
4309
|
+
{
|
|
4310
|
+
name: "get-endpoint-worker-metrics",
|
|
4311
|
+
title: "Get endpoint worker metrics",
|
|
4312
|
+
operationId: "getEndpointWorkerMetrics",
|
|
4313
|
+
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.",
|
|
4314
|
+
method: "GET",
|
|
4315
|
+
path: "/v2/serverless/{id}/metrics/workers",
|
|
4316
|
+
params: [
|
|
4317
|
+
{
|
|
4318
|
+
name: "id",
|
|
4319
|
+
location: "path"
|
|
4320
|
+
},
|
|
4321
|
+
{
|
|
4322
|
+
name: "startTime",
|
|
4323
|
+
location: "query"
|
|
4324
|
+
},
|
|
4325
|
+
{
|
|
4326
|
+
name: "endTime",
|
|
4327
|
+
location: "query"
|
|
4328
|
+
},
|
|
4329
|
+
{
|
|
4330
|
+
name: "interval",
|
|
4331
|
+
location: "query"
|
|
4332
|
+
},
|
|
4333
|
+
{
|
|
4334
|
+
name: "cursor",
|
|
4335
|
+
location: "query"
|
|
4336
|
+
},
|
|
4337
|
+
{
|
|
4338
|
+
name: "limit",
|
|
4339
|
+
location: "query"
|
|
4340
|
+
}
|
|
4341
|
+
],
|
|
4342
|
+
hasBody: false,
|
|
4343
|
+
annotations: {
|
|
4344
|
+
readOnlyHint: true,
|
|
4345
|
+
destructiveHint: false,
|
|
4346
|
+
idempotentHint: true,
|
|
4347
|
+
openWorldHint: true
|
|
4348
|
+
},
|
|
4349
|
+
inputSchema: {
|
|
4350
|
+
type: "object",
|
|
4351
|
+
properties: {
|
|
4352
|
+
id: {
|
|
4353
|
+
type: "string",
|
|
4354
|
+
description: "Serverless endpoint identifier"
|
|
4355
|
+
},
|
|
4356
|
+
startTime: {
|
|
4357
|
+
type: "string",
|
|
4358
|
+
format: "date-time",
|
|
4359
|
+
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."
|
|
4360
|
+
},
|
|
4361
|
+
endTime: {
|
|
4362
|
+
type: "string",
|
|
4363
|
+
format: "date-time",
|
|
4364
|
+
description: "End of the window (RFC 3339), exclusive. Defaults to now; a future value is treated as now."
|
|
4365
|
+
},
|
|
4366
|
+
interval: {
|
|
4367
|
+
$ref: "#/$defs/EndpointMetricsInterval",
|
|
4368
|
+
description: "Bucket size. Defaults to 1h.",
|
|
4369
|
+
type: "string"
|
|
4370
|
+
},
|
|
4371
|
+
cursor: {
|
|
4372
|
+
type: "string",
|
|
4373
|
+
minLength: 1,
|
|
4374
|
+
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."
|
|
4375
|
+
},
|
|
4376
|
+
limit: {
|
|
4377
|
+
type: "integer",
|
|
4378
|
+
minimum: 1,
|
|
4379
|
+
maximum: 1e3,
|
|
4380
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
4381
|
+
}
|
|
4382
|
+
},
|
|
4383
|
+
required: ["id"],
|
|
4384
|
+
$defs: {
|
|
4385
|
+
EndpointMetricsInterval: {
|
|
4386
|
+
type: "string",
|
|
4387
|
+
enum: ["1m", "5m", "15m", "30m", "1h", "6h", "12h", "1d"],
|
|
4388
|
+
default: "1h",
|
|
4389
|
+
description: "Bucket size for endpoint metrics."
|
|
4390
|
+
}
|
|
4391
|
+
}
|
|
4392
|
+
}
|
|
4393
|
+
},
|
|
3542
4394
|
{
|
|
3543
4395
|
name: "get-global-volume",
|
|
3544
4396
|
title: "Get global volume",
|
|
@@ -3651,7 +4503,7 @@ var generatedTools = [
|
|
|
3651
4503
|
},
|
|
3652
4504
|
cloud: {
|
|
3653
4505
|
$ref: "#/$defs/GpuCloudFilter",
|
|
3654
|
-
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY.
|
|
4506
|
+
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Default when omitted: SECURE.",
|
|
3655
4507
|
type: "string"
|
|
3656
4508
|
},
|
|
3657
4509
|
countryCodes: {
|
|
@@ -3690,19 +4542,133 @@ var generatedTools = [
|
|
|
3690
4542
|
},
|
|
3691
4543
|
Product: {
|
|
3692
4544
|
type: "string",
|
|
3693
|
-
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
3694
|
-
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
4545
|
+
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
4546
|
+
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
4547
|
+
}
|
|
4548
|
+
}
|
|
4549
|
+
}
|
|
4550
|
+
},
|
|
4551
|
+
{
|
|
4552
|
+
name: "get-network-volume",
|
|
4553
|
+
title: "Get network volume",
|
|
4554
|
+
operationId: "getNetworkVolume",
|
|
4555
|
+
description: "Get a network volume. Returns a single network volume by ID.",
|
|
4556
|
+
method: "GET",
|
|
4557
|
+
path: "/v2/network-volumes/{id}",
|
|
4558
|
+
params: [
|
|
4559
|
+
{
|
|
4560
|
+
name: "id",
|
|
4561
|
+
location: "path"
|
|
4562
|
+
}
|
|
4563
|
+
],
|
|
4564
|
+
hasBody: false,
|
|
4565
|
+
annotations: {
|
|
4566
|
+
readOnlyHint: true,
|
|
4567
|
+
destructiveHint: false,
|
|
4568
|
+
idempotentHint: true,
|
|
4569
|
+
openWorldHint: true
|
|
4570
|
+
},
|
|
4571
|
+
inputSchema: {
|
|
4572
|
+
type: "object",
|
|
4573
|
+
properties: {
|
|
4574
|
+
id: {
|
|
4575
|
+
type: "string",
|
|
4576
|
+
description: "Network volume identifier"
|
|
4577
|
+
}
|
|
4578
|
+
},
|
|
4579
|
+
required: ["id"]
|
|
4580
|
+
}
|
|
4581
|
+
},
|
|
4582
|
+
{
|
|
4583
|
+
name: "get-organization",
|
|
4584
|
+
title: "Get organization",
|
|
4585
|
+
operationId: "getOrganization",
|
|
4586
|
+
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.",
|
|
4587
|
+
method: "GET",
|
|
4588
|
+
path: "/v2/organization",
|
|
4589
|
+
params: [],
|
|
4590
|
+
hasBody: false,
|
|
4591
|
+
annotations: {
|
|
4592
|
+
readOnlyHint: true,
|
|
4593
|
+
destructiveHint: false,
|
|
4594
|
+
idempotentHint: true,
|
|
4595
|
+
openWorldHint: true
|
|
4596
|
+
},
|
|
4597
|
+
inputSchema: {
|
|
4598
|
+
type: "object",
|
|
4599
|
+
properties: {}
|
|
4600
|
+
}
|
|
4601
|
+
},
|
|
4602
|
+
{
|
|
4603
|
+
name: "get-organization-group",
|
|
4604
|
+
title: "Get organization group",
|
|
4605
|
+
operationId: "getOrganizationGroup",
|
|
4606
|
+
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.",
|
|
4607
|
+
method: "GET",
|
|
4608
|
+
path: "/v2/organization/groups/{id}",
|
|
4609
|
+
params: [
|
|
4610
|
+
{
|
|
4611
|
+
name: "id",
|
|
4612
|
+
location: "path"
|
|
4613
|
+
}
|
|
4614
|
+
],
|
|
4615
|
+
hasBody: false,
|
|
4616
|
+
annotations: {
|
|
4617
|
+
readOnlyHint: true,
|
|
4618
|
+
destructiveHint: false,
|
|
4619
|
+
idempotentHint: true,
|
|
4620
|
+
openWorldHint: true
|
|
4621
|
+
},
|
|
4622
|
+
inputSchema: {
|
|
4623
|
+
type: "object",
|
|
4624
|
+
properties: {
|
|
4625
|
+
id: {
|
|
4626
|
+
type: "string",
|
|
4627
|
+
minLength: 1,
|
|
4628
|
+
description: "Group ID."
|
|
4629
|
+
}
|
|
4630
|
+
},
|
|
4631
|
+
required: ["id"]
|
|
4632
|
+
}
|
|
4633
|
+
},
|
|
4634
|
+
{
|
|
4635
|
+
name: "get-organization-invite",
|
|
4636
|
+
title: "Get organization invite",
|
|
4637
|
+
operationId: "getOrganizationInvite",
|
|
4638
|
+
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.",
|
|
4639
|
+
method: "GET",
|
|
4640
|
+
path: "/v2/organization/invites/{id}",
|
|
4641
|
+
params: [
|
|
4642
|
+
{
|
|
4643
|
+
name: "id",
|
|
4644
|
+
location: "path"
|
|
4645
|
+
}
|
|
4646
|
+
],
|
|
4647
|
+
hasBody: false,
|
|
4648
|
+
annotations: {
|
|
4649
|
+
readOnlyHint: true,
|
|
4650
|
+
destructiveHint: false,
|
|
4651
|
+
idempotentHint: true,
|
|
4652
|
+
openWorldHint: true
|
|
4653
|
+
},
|
|
4654
|
+
inputSchema: {
|
|
4655
|
+
type: "object",
|
|
4656
|
+
properties: {
|
|
4657
|
+
id: {
|
|
4658
|
+
type: "string",
|
|
4659
|
+
description: "Invite identifier"
|
|
3695
4660
|
}
|
|
3696
|
-
}
|
|
4661
|
+
},
|
|
4662
|
+
required: ["id"]
|
|
3697
4663
|
}
|
|
3698
4664
|
},
|
|
3699
4665
|
{
|
|
3700
|
-
name: "get-
|
|
3701
|
-
title: "Get
|
|
3702
|
-
operationId: "
|
|
3703
|
-
description: "Get
|
|
4666
|
+
name: "get-organization-role",
|
|
4667
|
+
title: "Get organization role",
|
|
4668
|
+
operationId: "getOrganizationRole",
|
|
4669
|
+
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.",
|
|
3704
4670
|
method: "GET",
|
|
3705
|
-
path: "/v2/
|
|
4671
|
+
path: "/v2/organization/roles/{id}",
|
|
3706
4672
|
params: [
|
|
3707
4673
|
{
|
|
3708
4674
|
name: "id",
|
|
@@ -3721,20 +4687,31 @@ var generatedTools = [
|
|
|
3721
4687
|
properties: {
|
|
3722
4688
|
id: {
|
|
3723
4689
|
type: "string",
|
|
3724
|
-
description: "
|
|
4690
|
+
description: "Role identifier"
|
|
3725
4691
|
}
|
|
3726
4692
|
},
|
|
3727
4693
|
required: ["id"]
|
|
3728
4694
|
}
|
|
3729
4695
|
},
|
|
3730
4696
|
{
|
|
3731
|
-
name: "get-organization",
|
|
3732
|
-
title: "Get organization",
|
|
3733
|
-
operationId: "
|
|
3734
|
-
description: "
|
|
4697
|
+
name: "get-organization-role-capabilities",
|
|
4698
|
+
title: "Get organization role capabilities",
|
|
4699
|
+
operationId: "getOrganizationRoleCapabilities",
|
|
4700
|
+
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.",
|
|
3735
4701
|
method: "GET",
|
|
3736
|
-
path: "/v2/organization",
|
|
3737
|
-
params: [
|
|
4702
|
+
path: "/v2/organization/roles/capabilities",
|
|
4703
|
+
params: [
|
|
4704
|
+
{
|
|
4705
|
+
name: "family",
|
|
4706
|
+
location: "query",
|
|
4707
|
+
explode: false
|
|
4708
|
+
},
|
|
4709
|
+
{
|
|
4710
|
+
name: "verb",
|
|
4711
|
+
location: "query",
|
|
4712
|
+
explode: false
|
|
4713
|
+
}
|
|
4714
|
+
],
|
|
3738
4715
|
hasBody: false,
|
|
3739
4716
|
annotations: {
|
|
3740
4717
|
readOnlyHint: true,
|
|
@@ -3744,7 +4721,22 @@ var generatedTools = [
|
|
|
3744
4721
|
},
|
|
3745
4722
|
inputSchema: {
|
|
3746
4723
|
type: "object",
|
|
3747
|
-
properties: {
|
|
4724
|
+
properties: {
|
|
4725
|
+
family: {
|
|
4726
|
+
type: "array",
|
|
4727
|
+
items: {
|
|
4728
|
+
type: "string"
|
|
4729
|
+
},
|
|
4730
|
+
description: "Only return these capability families, matched exactly. Comma-separated; a family matching any listed value is returned. An empty value is ignored."
|
|
4731
|
+
},
|
|
4732
|
+
verb: {
|
|
4733
|
+
type: "array",
|
|
4734
|
+
items: {
|
|
4735
|
+
type: "string"
|
|
4736
|
+
},
|
|
4737
|
+
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."
|
|
4738
|
+
}
|
|
4739
|
+
}
|
|
3748
4740
|
}
|
|
3749
4741
|
},
|
|
3750
4742
|
{
|
|
@@ -4227,6 +5219,107 @@ var generatedTools = [
|
|
|
4227
5219
|
}
|
|
4228
5220
|
}
|
|
4229
5221
|
},
|
|
5222
|
+
{
|
|
5223
|
+
name: "list-cost-center-resources",
|
|
5224
|
+
title: "List cost center resources",
|
|
5225
|
+
operationId: "listCostCenterResources",
|
|
5226
|
+
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.",
|
|
5227
|
+
method: "GET",
|
|
5228
|
+
path: "/v2/cost-centers/{id}/resources",
|
|
5229
|
+
params: [
|
|
5230
|
+
{
|
|
5231
|
+
name: "id",
|
|
5232
|
+
location: "path"
|
|
5233
|
+
},
|
|
5234
|
+
{
|
|
5235
|
+
name: "cursor",
|
|
5236
|
+
location: "query"
|
|
5237
|
+
},
|
|
5238
|
+
{
|
|
5239
|
+
name: "limit",
|
|
5240
|
+
location: "query"
|
|
5241
|
+
}
|
|
5242
|
+
],
|
|
5243
|
+
hasBody: false,
|
|
5244
|
+
annotations: {
|
|
5245
|
+
readOnlyHint: true,
|
|
5246
|
+
destructiveHint: false,
|
|
5247
|
+
idempotentHint: true,
|
|
5248
|
+
openWorldHint: true
|
|
5249
|
+
},
|
|
5250
|
+
inputSchema: {
|
|
5251
|
+
type: "object",
|
|
5252
|
+
properties: {
|
|
5253
|
+
id: {
|
|
5254
|
+
type: "string",
|
|
5255
|
+
minLength: 1,
|
|
5256
|
+
description: "Cost center identifier."
|
|
5257
|
+
},
|
|
5258
|
+
cursor: {
|
|
5259
|
+
type: "string",
|
|
5260
|
+
minLength: 1,
|
|
5261
|
+
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."
|
|
5262
|
+
},
|
|
5263
|
+
limit: {
|
|
5264
|
+
type: "integer",
|
|
5265
|
+
minimum: 1,
|
|
5266
|
+
maximum: 1e3,
|
|
5267
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
5268
|
+
}
|
|
5269
|
+
},
|
|
5270
|
+
required: ["id"]
|
|
5271
|
+
}
|
|
5272
|
+
},
|
|
5273
|
+
{
|
|
5274
|
+
name: "list-cost-centers",
|
|
5275
|
+
title: "List cost centers",
|
|
5276
|
+
operationId: "listCostCenters",
|
|
5277
|
+
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.",
|
|
5278
|
+
method: "GET",
|
|
5279
|
+
path: "/v2/cost-centers",
|
|
5280
|
+
params: [
|
|
5281
|
+
{
|
|
5282
|
+
name: "search",
|
|
5283
|
+
location: "query"
|
|
5284
|
+
},
|
|
5285
|
+
{
|
|
5286
|
+
name: "cursor",
|
|
5287
|
+
location: "query"
|
|
5288
|
+
},
|
|
5289
|
+
{
|
|
5290
|
+
name: "limit",
|
|
5291
|
+
location: "query"
|
|
5292
|
+
}
|
|
5293
|
+
],
|
|
5294
|
+
hasBody: false,
|
|
5295
|
+
annotations: {
|
|
5296
|
+
readOnlyHint: true,
|
|
5297
|
+
destructiveHint: false,
|
|
5298
|
+
idempotentHint: true,
|
|
5299
|
+
openWorldHint: true
|
|
5300
|
+
},
|
|
5301
|
+
inputSchema: {
|
|
5302
|
+
type: "object",
|
|
5303
|
+
properties: {
|
|
5304
|
+
search: {
|
|
5305
|
+
type: "string",
|
|
5306
|
+
minLength: 1,
|
|
5307
|
+
description: "Case-insensitive substring match against `value`."
|
|
5308
|
+
},
|
|
5309
|
+
cursor: {
|
|
5310
|
+
type: "string",
|
|
5311
|
+
minLength: 1,
|
|
5312
|
+
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."
|
|
5313
|
+
},
|
|
5314
|
+
limit: {
|
|
5315
|
+
type: "integer",
|
|
5316
|
+
minimum: 1,
|
|
5317
|
+
maximum: 1e3,
|
|
5318
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
5319
|
+
}
|
|
5320
|
+
}
|
|
5321
|
+
}
|
|
5322
|
+
},
|
|
4230
5323
|
{
|
|
4231
5324
|
name: "list-cpu-types",
|
|
4232
5325
|
title: "List CPU types",
|
|
@@ -4757,7 +5850,7 @@ var generatedTools = [
|
|
|
4757
5850
|
},
|
|
4758
5851
|
cloud: {
|
|
4759
5852
|
$ref: "#/$defs/GpuCloudFilter",
|
|
4760
|
-
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY.
|
|
5853
|
+
description: "Cloud type for availability and lowest-price calculations. Valid only with include=AVAILABILITY. Supported values: SECURE, COMMUNITY. Default when omitted: SECURE.",
|
|
4761
5854
|
type: "string"
|
|
4762
5855
|
},
|
|
4763
5856
|
countryCodes: {
|
|
@@ -4790,43 +5883,151 @@ var generatedTools = [
|
|
|
4790
5883
|
},
|
|
4791
5884
|
GpuCloudFilter: {
|
|
4792
5885
|
type: "string",
|
|
4793
|
-
description: "GPU availability cloud filter.",
|
|
4794
|
-
enum: ["SECURE", "COMMUNITY"]
|
|
5886
|
+
description: "GPU availability cloud filter.",
|
|
5887
|
+
enum: ["SECURE", "COMMUNITY"]
|
|
5888
|
+
},
|
|
5889
|
+
Product: {
|
|
5890
|
+
type: "string",
|
|
5891
|
+
description: "Catalog product availability context. Availability is product-specific, so this is required whenever availability is requested.",
|
|
5892
|
+
enum: ["POD", "CLUSTER", "SERVERLESS"]
|
|
5893
|
+
}
|
|
5894
|
+
}
|
|
5895
|
+
}
|
|
5896
|
+
},
|
|
5897
|
+
{
|
|
5898
|
+
name: "list-network-volume-billing",
|
|
5899
|
+
title: "List network volume billing",
|
|
5900
|
+
operationId: "listNetworkVolumeBilling",
|
|
5901
|
+
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.",
|
|
5902
|
+
method: "GET",
|
|
5903
|
+
path: "/v2/billing/network-volumes",
|
|
5904
|
+
params: [
|
|
5905
|
+
{
|
|
5906
|
+
name: "startTime",
|
|
5907
|
+
location: "query"
|
|
5908
|
+
},
|
|
5909
|
+
{
|
|
5910
|
+
name: "endTime",
|
|
5911
|
+
location: "query"
|
|
5912
|
+
},
|
|
5913
|
+
{
|
|
5914
|
+
name: "bucketSize",
|
|
5915
|
+
location: "query"
|
|
5916
|
+
},
|
|
5917
|
+
{
|
|
5918
|
+
name: "lastN",
|
|
5919
|
+
location: "query"
|
|
5920
|
+
},
|
|
5921
|
+
{
|
|
5922
|
+
name: "networkVolumeId",
|
|
5923
|
+
location: "query"
|
|
5924
|
+
}
|
|
5925
|
+
],
|
|
5926
|
+
hasBody: false,
|
|
5927
|
+
annotations: {
|
|
5928
|
+
readOnlyHint: true,
|
|
5929
|
+
destructiveHint: false,
|
|
5930
|
+
idempotentHint: true,
|
|
5931
|
+
openWorldHint: true
|
|
5932
|
+
},
|
|
5933
|
+
inputSchema: {
|
|
5934
|
+
type: "object",
|
|
5935
|
+
properties: {
|
|
5936
|
+
startTime: {
|
|
5937
|
+
type: "string",
|
|
5938
|
+
format: "date-time",
|
|
5939
|
+
description: "Start of the billing period (RFC 3339). Defaults to 30 days ago."
|
|
5940
|
+
},
|
|
5941
|
+
endTime: {
|
|
5942
|
+
type: "string",
|
|
5943
|
+
format: "date-time",
|
|
5944
|
+
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."
|
|
5945
|
+
},
|
|
5946
|
+
bucketSize: {
|
|
5947
|
+
$ref: "#/$defs/BillingBucketSize",
|
|
5948
|
+
description: "Length of each billing time bucket. Defaults to day.",
|
|
5949
|
+
type: "string"
|
|
5950
|
+
},
|
|
5951
|
+
lastN: {
|
|
5952
|
+
type: "integer",
|
|
5953
|
+
minimum: 1,
|
|
5954
|
+
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".'
|
|
5955
|
+
},
|
|
5956
|
+
networkVolumeId: {
|
|
5957
|
+
type: "string",
|
|
5958
|
+
description: "Filter to a specific network volume."
|
|
5959
|
+
}
|
|
5960
|
+
},
|
|
5961
|
+
$defs: {
|
|
5962
|
+
BillingBucketSize: {
|
|
5963
|
+
type: "string",
|
|
5964
|
+
enum: ["hour", "day", "week", "month", "year"],
|
|
5965
|
+
default: "day",
|
|
5966
|
+
description: "Length of each billing time bucket.",
|
|
5967
|
+
examples: ["day"]
|
|
5968
|
+
}
|
|
5969
|
+
}
|
|
5970
|
+
}
|
|
5971
|
+
},
|
|
5972
|
+
{
|
|
5973
|
+
name: "list-network-volumes",
|
|
5974
|
+
title: "List network volumes",
|
|
5975
|
+
operationId: "listNetworkVolumes",
|
|
5976
|
+
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.",
|
|
5977
|
+
method: "GET",
|
|
5978
|
+
path: "/v2/network-volumes",
|
|
5979
|
+
params: [
|
|
5980
|
+
{
|
|
5981
|
+
name: "cursor",
|
|
5982
|
+
location: "query"
|
|
5983
|
+
},
|
|
5984
|
+
{
|
|
5985
|
+
name: "limit",
|
|
5986
|
+
location: "query"
|
|
5987
|
+
}
|
|
5988
|
+
],
|
|
5989
|
+
hasBody: false,
|
|
5990
|
+
annotations: {
|
|
5991
|
+
readOnlyHint: true,
|
|
5992
|
+
destructiveHint: false,
|
|
5993
|
+
idempotentHint: true,
|
|
5994
|
+
openWorldHint: true
|
|
5995
|
+
},
|
|
5996
|
+
inputSchema: {
|
|
5997
|
+
type: "object",
|
|
5998
|
+
properties: {
|
|
5999
|
+
cursor: {
|
|
6000
|
+
type: "string",
|
|
6001
|
+
minLength: 1,
|
|
6002
|
+
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."
|
|
4795
6003
|
},
|
|
4796
|
-
|
|
4797
|
-
type: "
|
|
4798
|
-
|
|
4799
|
-
|
|
6004
|
+
limit: {
|
|
6005
|
+
type: "integer",
|
|
6006
|
+
minimum: 1,
|
|
6007
|
+
maximum: 1e3,
|
|
6008
|
+
description: "Page size, 1\u20131000. Defaults to 1000 when omitted."
|
|
4800
6009
|
}
|
|
4801
6010
|
}
|
|
4802
6011
|
}
|
|
4803
6012
|
},
|
|
4804
6013
|
{
|
|
4805
|
-
name: "list-
|
|
4806
|
-
title: "List
|
|
4807
|
-
operationId: "
|
|
4808
|
-
description: "
|
|
6014
|
+
name: "list-organization-group-members",
|
|
6015
|
+
title: "List organization group members",
|
|
6016
|
+
operationId: "listOrganizationGroupMembers",
|
|
6017
|
+
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.",
|
|
4809
6018
|
method: "GET",
|
|
4810
|
-
path: "/v2/
|
|
6019
|
+
path: "/v2/organization/groups/{id}/members",
|
|
4811
6020
|
params: [
|
|
4812
6021
|
{
|
|
4813
|
-
name: "
|
|
4814
|
-
location: "
|
|
4815
|
-
},
|
|
4816
|
-
{
|
|
4817
|
-
name: "endTime",
|
|
4818
|
-
location: "query"
|
|
4819
|
-
},
|
|
4820
|
-
{
|
|
4821
|
-
name: "bucketSize",
|
|
4822
|
-
location: "query"
|
|
6022
|
+
name: "id",
|
|
6023
|
+
location: "path"
|
|
4823
6024
|
},
|
|
4824
6025
|
{
|
|
4825
|
-
name: "
|
|
6026
|
+
name: "cursor",
|
|
4826
6027
|
location: "query"
|
|
4827
6028
|
},
|
|
4828
6029
|
{
|
|
4829
|
-
name: "
|
|
6030
|
+
name: "limit",
|
|
4830
6031
|
location: "query"
|
|
4831
6032
|
}
|
|
4832
6033
|
],
|
|
@@ -4840,50 +6041,38 @@ var generatedTools = [
|
|
|
4840
6041
|
inputSchema: {
|
|
4841
6042
|
type: "object",
|
|
4842
6043
|
properties: {
|
|
4843
|
-
|
|
6044
|
+
id: {
|
|
4844
6045
|
type: "string",
|
|
4845
|
-
|
|
4846
|
-
description: "
|
|
6046
|
+
minLength: 1,
|
|
6047
|
+
description: "Group ID."
|
|
4847
6048
|
},
|
|
4848
|
-
|
|
6049
|
+
cursor: {
|
|
4849
6050
|
type: "string",
|
|
4850
|
-
|
|
4851
|
-
description: "
|
|
4852
|
-
},
|
|
4853
|
-
bucketSize: {
|
|
4854
|
-
$ref: "#/$defs/BillingBucketSize",
|
|
4855
|
-
description: "Length of each billing time bucket. Defaults to day.",
|
|
4856
|
-
type: "string"
|
|
6051
|
+
minLength: 1,
|
|
6052
|
+
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."
|
|
4857
6053
|
},
|
|
4858
|
-
|
|
6054
|
+
limit: {
|
|
4859
6055
|
type: "integer",
|
|
4860
6056
|
minimum: 1,
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
networkVolumeId: {
|
|
4864
|
-
type: "string",
|
|
4865
|
-
description: "Filter to a specific network volume."
|
|
6057
|
+
maximum: 100,
|
|
6058
|
+
description: "Page size, 1\u2013100. Defaults to 100 when omitted."
|
|
4866
6059
|
}
|
|
4867
6060
|
},
|
|
4868
|
-
|
|
4869
|
-
BillingBucketSize: {
|
|
4870
|
-
type: "string",
|
|
4871
|
-
enum: ["hour", "day", "week", "month", "year"],
|
|
4872
|
-
default: "day",
|
|
4873
|
-
description: "Length of each billing time bucket.",
|
|
4874
|
-
examples: ["day"]
|
|
4875
|
-
}
|
|
4876
|
-
}
|
|
6061
|
+
required: ["id"]
|
|
4877
6062
|
}
|
|
4878
6063
|
},
|
|
4879
6064
|
{
|
|
4880
|
-
name: "list-
|
|
4881
|
-
title: "List
|
|
4882
|
-
operationId: "
|
|
4883
|
-
description: "List
|
|
6065
|
+
name: "list-organization-groups",
|
|
6066
|
+
title: "List organization groups",
|
|
6067
|
+
operationId: "listOrganizationGroups",
|
|
6068
|
+
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.",
|
|
4884
6069
|
method: "GET",
|
|
4885
|
-
path: "/v2/
|
|
6070
|
+
path: "/v2/organization/groups",
|
|
4886
6071
|
params: [
|
|
6072
|
+
{
|
|
6073
|
+
name: "name",
|
|
6074
|
+
location: "query"
|
|
6075
|
+
},
|
|
4887
6076
|
{
|
|
4888
6077
|
name: "cursor",
|
|
4889
6078
|
location: "query"
|
|
@@ -4903,6 +6092,10 @@ var generatedTools = [
|
|
|
4903
6092
|
inputSchema: {
|
|
4904
6093
|
type: "object",
|
|
4905
6094
|
properties: {
|
|
6095
|
+
name: {
|
|
6096
|
+
type: "string",
|
|
6097
|
+
description: "Optional case-insensitive substring of the group name. An empty value applies no filter."
|
|
6098
|
+
},
|
|
4906
6099
|
cursor: {
|
|
4907
6100
|
type: "string",
|
|
4908
6101
|
minLength: 1,
|
|
@@ -4911,12 +6104,52 @@ var generatedTools = [
|
|
|
4911
6104
|
limit: {
|
|
4912
6105
|
type: "integer",
|
|
4913
6106
|
minimum: 1,
|
|
4914
|
-
maximum:
|
|
4915
|
-
description: "Page size, 1\
|
|
6107
|
+
maximum: 100,
|
|
6108
|
+
description: "Page size, 1\u2013100. Defaults to 100 when omitted."
|
|
4916
6109
|
}
|
|
4917
6110
|
}
|
|
4918
6111
|
}
|
|
4919
6112
|
},
|
|
6113
|
+
{
|
|
6114
|
+
name: "list-organization-invites",
|
|
6115
|
+
title: "List organization invites",
|
|
6116
|
+
operationId: "listOrganizationInvites",
|
|
6117
|
+
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.",
|
|
6118
|
+
method: "GET",
|
|
6119
|
+
path: "/v2/organization/invites",
|
|
6120
|
+
params: [],
|
|
6121
|
+
hasBody: false,
|
|
6122
|
+
annotations: {
|
|
6123
|
+
readOnlyHint: true,
|
|
6124
|
+
destructiveHint: false,
|
|
6125
|
+
idempotentHint: true,
|
|
6126
|
+
openWorldHint: true
|
|
6127
|
+
},
|
|
6128
|
+
inputSchema: {
|
|
6129
|
+
type: "object",
|
|
6130
|
+
properties: {}
|
|
6131
|
+
}
|
|
6132
|
+
},
|
|
6133
|
+
{
|
|
6134
|
+
name: "list-organization-roles",
|
|
6135
|
+
title: "List organization roles",
|
|
6136
|
+
operationId: "listOrganizationRoles",
|
|
6137
|
+
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.",
|
|
6138
|
+
method: "GET",
|
|
6139
|
+
path: "/v2/organization/roles",
|
|
6140
|
+
params: [],
|
|
6141
|
+
hasBody: false,
|
|
6142
|
+
annotations: {
|
|
6143
|
+
readOnlyHint: true,
|
|
6144
|
+
destructiveHint: false,
|
|
6145
|
+
idempotentHint: true,
|
|
6146
|
+
openWorldHint: true
|
|
6147
|
+
},
|
|
6148
|
+
inputSchema: {
|
|
6149
|
+
type: "object",
|
|
6150
|
+
properties: {}
|
|
6151
|
+
}
|
|
6152
|
+
},
|
|
4920
6153
|
{
|
|
4921
6154
|
name: "list-organization-users",
|
|
4922
6155
|
title: "List organization users",
|
|
@@ -5271,6 +6504,47 @@ var generatedTools = [
|
|
|
5271
6504
|
}
|
|
5272
6505
|
}
|
|
5273
6506
|
},
|
|
6507
|
+
{
|
|
6508
|
+
name: "remove-organization-group-member",
|
|
6509
|
+
title: "Remove organization group member",
|
|
6510
|
+
operationId: "removeOrganizationGroupMember",
|
|
6511
|
+
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.",
|
|
6512
|
+
method: "DELETE",
|
|
6513
|
+
path: "/v2/organization/groups/{id}/members/{userId}",
|
|
6514
|
+
params: [
|
|
6515
|
+
{
|
|
6516
|
+
name: "id",
|
|
6517
|
+
location: "path"
|
|
6518
|
+
},
|
|
6519
|
+
{
|
|
6520
|
+
name: "userId",
|
|
6521
|
+
location: "path"
|
|
6522
|
+
}
|
|
6523
|
+
],
|
|
6524
|
+
hasBody: false,
|
|
6525
|
+
annotations: {
|
|
6526
|
+
readOnlyHint: false,
|
|
6527
|
+
destructiveHint: true,
|
|
6528
|
+
idempotentHint: true,
|
|
6529
|
+
openWorldHint: true
|
|
6530
|
+
},
|
|
6531
|
+
inputSchema: {
|
|
6532
|
+
type: "object",
|
|
6533
|
+
properties: {
|
|
6534
|
+
id: {
|
|
6535
|
+
type: "string",
|
|
6536
|
+
minLength: 1,
|
|
6537
|
+
description: "Group ID."
|
|
6538
|
+
},
|
|
6539
|
+
userId: {
|
|
6540
|
+
type: "string",
|
|
6541
|
+
minLength: 1,
|
|
6542
|
+
description: "Organization member user ID."
|
|
6543
|
+
}
|
|
6544
|
+
},
|
|
6545
|
+
required: ["id", "userId"]
|
|
6546
|
+
}
|
|
6547
|
+
},
|
|
5274
6548
|
{
|
|
5275
6549
|
name: "revoke-delegation",
|
|
5276
6550
|
title: "Revoke ECR delegation",
|
|
@@ -5351,6 +6625,59 @@ var generatedTools = [
|
|
|
5351
6625
|
}
|
|
5352
6626
|
}
|
|
5353
6627
|
},
|
|
6628
|
+
{
|
|
6629
|
+
name: "update-cost-center",
|
|
6630
|
+
title: "Update cost center",
|
|
6631
|
+
operationId: "updateCostCenter",
|
|
6632
|
+
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.",
|
|
6633
|
+
method: "PATCH",
|
|
6634
|
+
path: "/v2/cost-centers/{id}",
|
|
6635
|
+
params: [
|
|
6636
|
+
{
|
|
6637
|
+
name: "id",
|
|
6638
|
+
location: "path"
|
|
6639
|
+
}
|
|
6640
|
+
],
|
|
6641
|
+
hasBody: true,
|
|
6642
|
+
annotations: {
|
|
6643
|
+
readOnlyHint: false,
|
|
6644
|
+
destructiveHint: false,
|
|
6645
|
+
idempotentHint: true,
|
|
6646
|
+
openWorldHint: true
|
|
6647
|
+
},
|
|
6648
|
+
inputSchema: {
|
|
6649
|
+
type: "object",
|
|
6650
|
+
properties: {
|
|
6651
|
+
id: {
|
|
6652
|
+
type: "string",
|
|
6653
|
+
minLength: 1,
|
|
6654
|
+
description: "Cost center identifier."
|
|
6655
|
+
},
|
|
6656
|
+
body: {
|
|
6657
|
+
$ref: "#/$defs/UpdateCostCenterRequest",
|
|
6658
|
+
type: "object"
|
|
6659
|
+
}
|
|
6660
|
+
},
|
|
6661
|
+
required: ["id", "body"],
|
|
6662
|
+
$defs: {
|
|
6663
|
+
UpdateCostCenterRequest: {
|
|
6664
|
+
type: "object",
|
|
6665
|
+
additionalProperties: false,
|
|
6666
|
+
required: ["value"],
|
|
6667
|
+
properties: {
|
|
6668
|
+
value: {
|
|
6669
|
+
type: "string",
|
|
6670
|
+
minLength: 1,
|
|
6671
|
+
maxLength: 50,
|
|
6672
|
+
pattern: "^\\s*\\S",
|
|
6673
|
+
description: "Leading and trailing whitespace is trimmed.",
|
|
6674
|
+
examples: ["team-ml-eu"]
|
|
6675
|
+
}
|
|
6676
|
+
}
|
|
6677
|
+
}
|
|
6678
|
+
}
|
|
6679
|
+
}
|
|
6680
|
+
},
|
|
5354
6681
|
{
|
|
5355
6682
|
name: "update-endpoint",
|
|
5356
6683
|
title: "Update endpoint",
|
|
@@ -5738,19 +7065,130 @@ var generatedTools = [
|
|
|
5738
7065
|
}
|
|
5739
7066
|
}
|
|
5740
7067
|
}
|
|
5741
|
-
],
|
|
5742
|
-
unevaluatedProperties: false
|
|
7068
|
+
],
|
|
7069
|
+
unevaluatedProperties: false
|
|
7070
|
+
}
|
|
7071
|
+
}
|
|
7072
|
+
}
|
|
7073
|
+
},
|
|
7074
|
+
{
|
|
7075
|
+
name: "update-global-volume",
|
|
7076
|
+
title: "Update global volume",
|
|
7077
|
+
operationId: "updateGlobalVolume",
|
|
7078
|
+
description: "Update a global volume. Updates mutable fields on a global volume. Only provided fields are changed.",
|
|
7079
|
+
method: "PATCH",
|
|
7080
|
+
path: "/v2/global-volumes/{id}",
|
|
7081
|
+
params: [
|
|
7082
|
+
{
|
|
7083
|
+
name: "id",
|
|
7084
|
+
location: "path"
|
|
7085
|
+
}
|
|
7086
|
+
],
|
|
7087
|
+
hasBody: true,
|
|
7088
|
+
annotations: {
|
|
7089
|
+
readOnlyHint: false,
|
|
7090
|
+
destructiveHint: false,
|
|
7091
|
+
idempotentHint: true,
|
|
7092
|
+
openWorldHint: true
|
|
7093
|
+
},
|
|
7094
|
+
inputSchema: {
|
|
7095
|
+
type: "object",
|
|
7096
|
+
properties: {
|
|
7097
|
+
id: {
|
|
7098
|
+
type: "string",
|
|
7099
|
+
description: "Global volume identifier"
|
|
7100
|
+
},
|
|
7101
|
+
body: {
|
|
7102
|
+
$ref: "#/$defs/UpdateGlobalVolumeRequest",
|
|
7103
|
+
type: "object"
|
|
7104
|
+
}
|
|
7105
|
+
},
|
|
7106
|
+
required: ["id", "body"],
|
|
7107
|
+
$defs: {
|
|
7108
|
+
UpdateGlobalVolumeRequest: {
|
|
7109
|
+
type: "object",
|
|
7110
|
+
additionalProperties: false,
|
|
7111
|
+
minProperties: 1,
|
|
7112
|
+
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
7113
|
+
properties: {
|
|
7114
|
+
name: {
|
|
7115
|
+
type: "string",
|
|
7116
|
+
minLength: 1,
|
|
7117
|
+
maxLength: 191,
|
|
7118
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
7119
|
+
description: "New human-readable name, 1\u2013191 characters with at least one non-whitespace character. Leading and trailing whitespace is trimmed.",
|
|
7120
|
+
examples: ["renamed-volume"]
|
|
7121
|
+
}
|
|
7122
|
+
}
|
|
7123
|
+
}
|
|
7124
|
+
}
|
|
7125
|
+
}
|
|
7126
|
+
},
|
|
7127
|
+
{
|
|
7128
|
+
name: "update-network-volume",
|
|
7129
|
+
title: "Update network volume",
|
|
7130
|
+
operationId: "updateNetworkVolume",
|
|
7131
|
+
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.",
|
|
7132
|
+
method: "PATCH",
|
|
7133
|
+
path: "/v2/network-volumes/{id}",
|
|
7134
|
+
params: [
|
|
7135
|
+
{
|
|
7136
|
+
name: "id",
|
|
7137
|
+
location: "path"
|
|
7138
|
+
}
|
|
7139
|
+
],
|
|
7140
|
+
hasBody: true,
|
|
7141
|
+
annotations: {
|
|
7142
|
+
readOnlyHint: false,
|
|
7143
|
+
destructiveHint: false,
|
|
7144
|
+
idempotentHint: true,
|
|
7145
|
+
openWorldHint: true
|
|
7146
|
+
},
|
|
7147
|
+
inputSchema: {
|
|
7148
|
+
type: "object",
|
|
7149
|
+
properties: {
|
|
7150
|
+
id: {
|
|
7151
|
+
type: "string",
|
|
7152
|
+
description: "Network volume identifier"
|
|
7153
|
+
},
|
|
7154
|
+
body: {
|
|
7155
|
+
$ref: "#/$defs/UpdateNetworkVolumeRequest",
|
|
7156
|
+
type: "object"
|
|
7157
|
+
}
|
|
7158
|
+
},
|
|
7159
|
+
required: ["id", "body"],
|
|
7160
|
+
$defs: {
|
|
7161
|
+
UpdateNetworkVolumeRequest: {
|
|
7162
|
+
type: "object",
|
|
7163
|
+
additionalProperties: false,
|
|
7164
|
+
minProperties: 1,
|
|
7165
|
+
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
7166
|
+
properties: {
|
|
7167
|
+
name: {
|
|
7168
|
+
type: "string",
|
|
7169
|
+
minLength: 1,
|
|
7170
|
+
description: "New human-readable name",
|
|
7171
|
+
examples: ["renamed-volume"]
|
|
7172
|
+
},
|
|
7173
|
+
size: {
|
|
7174
|
+
type: "integer",
|
|
7175
|
+
minimum: 10,
|
|
7176
|
+
maximum: 4096,
|
|
7177
|
+
description: "New size in GB. Must be greater than or equal to the current size \u2014 network volume storage cannot be reduced.",
|
|
7178
|
+
examples: [100]
|
|
7179
|
+
}
|
|
7180
|
+
}
|
|
5743
7181
|
}
|
|
5744
7182
|
}
|
|
5745
7183
|
}
|
|
5746
7184
|
},
|
|
5747
7185
|
{
|
|
5748
|
-
name: "update-
|
|
5749
|
-
title: "Update
|
|
5750
|
-
operationId: "
|
|
5751
|
-
description: "
|
|
7186
|
+
name: "update-organization-group",
|
|
7187
|
+
title: "Update organization group",
|
|
7188
|
+
operationId: "updateOrganizationGroup",
|
|
7189
|
+
description: "Rename a group in your current organization",
|
|
5752
7190
|
method: "PATCH",
|
|
5753
|
-
path: "/v2/
|
|
7191
|
+
path: "/v2/organization/groups/{id}",
|
|
5754
7192
|
params: [
|
|
5755
7193
|
{
|
|
5756
7194
|
name: "id",
|
|
@@ -5769,27 +7207,28 @@ var generatedTools = [
|
|
|
5769
7207
|
properties: {
|
|
5770
7208
|
id: {
|
|
5771
7209
|
type: "string",
|
|
5772
|
-
|
|
7210
|
+
minLength: 1,
|
|
7211
|
+
description: "Group ID."
|
|
5773
7212
|
},
|
|
5774
7213
|
body: {
|
|
5775
|
-
$ref: "#/$defs/
|
|
7214
|
+
$ref: "#/$defs/UpdateOrganizationGroupRequest",
|
|
5776
7215
|
type: "object"
|
|
5777
7216
|
}
|
|
5778
7217
|
},
|
|
5779
7218
|
required: ["id", "body"],
|
|
5780
7219
|
$defs: {
|
|
5781
|
-
|
|
7220
|
+
UpdateOrganizationGroupRequest: {
|
|
5782
7221
|
type: "object",
|
|
5783
7222
|
additionalProperties: false,
|
|
5784
|
-
|
|
5785
|
-
description: "Only the provided fields are updated. At least one field must be present; an empty body is rejected.",
|
|
7223
|
+
required: ["name"],
|
|
5786
7224
|
properties: {
|
|
5787
7225
|
name: {
|
|
5788
7226
|
type: "string",
|
|
5789
7227
|
minLength: 1,
|
|
5790
7228
|
maxLength: 191,
|
|
5791
|
-
|
|
5792
|
-
|
|
7229
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
7230
|
+
description: "Group name with at least one non-whitespace character; surrounding whitespace is trimmed.",
|
|
7231
|
+
examples: ["Research"]
|
|
5793
7232
|
}
|
|
5794
7233
|
}
|
|
5795
7234
|
}
|
|
@@ -5797,12 +7236,12 @@ var generatedTools = [
|
|
|
5797
7236
|
}
|
|
5798
7237
|
},
|
|
5799
7238
|
{
|
|
5800
|
-
name: "update-
|
|
5801
|
-
title: "Update
|
|
5802
|
-
operationId: "
|
|
5803
|
-
description: "Update a
|
|
7239
|
+
name: "update-organization-role",
|
|
7240
|
+
title: "Update organization role",
|
|
7241
|
+
operationId: "updateOrganizationRole",
|
|
7242
|
+
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.",
|
|
5804
7243
|
method: "PATCH",
|
|
5805
|
-
path: "/v2/
|
|
7244
|
+
path: "/v2/organization/roles/{id}",
|
|
5806
7245
|
params: [
|
|
5807
7246
|
{
|
|
5808
7247
|
name: "id",
|
|
@@ -5812,7 +7251,7 @@ var generatedTools = [
|
|
|
5812
7251
|
hasBody: true,
|
|
5813
7252
|
annotations: {
|
|
5814
7253
|
readOnlyHint: false,
|
|
5815
|
-
destructiveHint:
|
|
7254
|
+
destructiveHint: true,
|
|
5816
7255
|
idempotentHint: true,
|
|
5817
7256
|
openWorldHint: true
|
|
5818
7257
|
},
|
|
@@ -5821,33 +7260,129 @@ var generatedTools = [
|
|
|
5821
7260
|
properties: {
|
|
5822
7261
|
id: {
|
|
5823
7262
|
type: "string",
|
|
5824
|
-
description: "
|
|
7263
|
+
description: "Role identifier"
|
|
5825
7264
|
},
|
|
5826
7265
|
body: {
|
|
5827
|
-
$ref: "#/$defs/
|
|
7266
|
+
$ref: "#/$defs/UpdateOrganizationRoleRequest",
|
|
5828
7267
|
type: "object"
|
|
5829
7268
|
}
|
|
5830
7269
|
},
|
|
5831
7270
|
required: ["id", "body"],
|
|
5832
7271
|
$defs: {
|
|
5833
|
-
|
|
7272
|
+
OrganizationRoleCapabilitiesInput: {
|
|
7273
|
+
type: "array",
|
|
7274
|
+
description: "What the role grants, as `FAMILY:VERB` capabilities from `get-organization-role-capabilities`. The caller must hold every capability it lists.",
|
|
7275
|
+
minItems: 1,
|
|
7276
|
+
uniqueItems: true,
|
|
7277
|
+
items: {
|
|
7278
|
+
type: "string",
|
|
7279
|
+
pattern: "^[A-Z0-9_]+:[A-Z0-9_]+$"
|
|
7280
|
+
},
|
|
7281
|
+
examples: [["POD:VIEW"]]
|
|
7282
|
+
},
|
|
7283
|
+
OrganizationRoleName: {
|
|
7284
|
+
type: "string",
|
|
7285
|
+
minLength: 1,
|
|
7286
|
+
maxLength: 191,
|
|
7287
|
+
pattern: "[^\\t-\\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]",
|
|
7288
|
+
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.",
|
|
7289
|
+
examples: ["Pod viewer"]
|
|
7290
|
+
},
|
|
7291
|
+
UpdateOrganizationRoleRequest: {
|
|
5834
7292
|
type: "object",
|
|
5835
7293
|
additionalProperties: false,
|
|
5836
7294
|
minProperties: 1,
|
|
5837
|
-
description: "
|
|
7295
|
+
description: "The fields to change; omitted fields are unchanged. `capabilities` replaces the role's whole grant set rather than adding to it.",
|
|
5838
7296
|
properties: {
|
|
5839
7297
|
name: {
|
|
7298
|
+
$ref: "#/$defs/OrganizationRoleName"
|
|
7299
|
+
},
|
|
7300
|
+
capabilities: {
|
|
7301
|
+
$ref: "#/$defs/OrganizationRoleCapabilitiesInput"
|
|
7302
|
+
}
|
|
7303
|
+
}
|
|
7304
|
+
}
|
|
7305
|
+
}
|
|
7306
|
+
}
|
|
7307
|
+
},
|
|
7308
|
+
{
|
|
7309
|
+
name: "update-organization-user",
|
|
7310
|
+
title: "Update organization user",
|
|
7311
|
+
operationId: "updateOrganizationUser",
|
|
7312
|
+
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.",
|
|
7313
|
+
method: "PATCH",
|
|
7314
|
+
path: "/v2/organization/users/{id}",
|
|
7315
|
+
params: [
|
|
7316
|
+
{
|
|
7317
|
+
name: "id",
|
|
7318
|
+
location: "path"
|
|
7319
|
+
}
|
|
7320
|
+
],
|
|
7321
|
+
hasBody: true,
|
|
7322
|
+
annotations: {
|
|
7323
|
+
readOnlyHint: false,
|
|
7324
|
+
destructiveHint: true,
|
|
7325
|
+
idempotentHint: true,
|
|
7326
|
+
openWorldHint: true
|
|
7327
|
+
},
|
|
7328
|
+
inputSchema: {
|
|
7329
|
+
type: "object",
|
|
7330
|
+
properties: {
|
|
7331
|
+
id: {
|
|
7332
|
+
type: "string",
|
|
7333
|
+
description: "User identifier"
|
|
7334
|
+
},
|
|
7335
|
+
body: {
|
|
7336
|
+
$ref: "#/$defs/UpdateOrganizationUserRequest",
|
|
7337
|
+
type: "object"
|
|
7338
|
+
}
|
|
7339
|
+
},
|
|
7340
|
+
required: ["id", "body"],
|
|
7341
|
+
$defs: {
|
|
7342
|
+
OrganizationGroupInput: {
|
|
7343
|
+
type: "object",
|
|
7344
|
+
description: "An organization group, by ID.",
|
|
7345
|
+
additionalProperties: false,
|
|
7346
|
+
required: ["id"],
|
|
7347
|
+
properties: {
|
|
7348
|
+
id: {
|
|
5840
7349
|
type: "string",
|
|
5841
7350
|
minLength: 1,
|
|
5842
|
-
description: "
|
|
5843
|
-
examples: ["
|
|
7351
|
+
description: "Group ID.",
|
|
7352
|
+
examples: ["group_id_abc_123"]
|
|
7353
|
+
}
|
|
7354
|
+
}
|
|
7355
|
+
},
|
|
7356
|
+
OrganizationRoleInput: {
|
|
7357
|
+
type: "object",
|
|
7358
|
+
description: "An organization role to assign, by ID.",
|
|
7359
|
+
additionalProperties: false,
|
|
7360
|
+
required: ["id"],
|
|
7361
|
+
properties: {
|
|
7362
|
+
id: {
|
|
7363
|
+
type: "string",
|
|
7364
|
+
minLength: 1,
|
|
7365
|
+
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.",
|
|
7366
|
+
examples: ["builtin:dev"]
|
|
7367
|
+
}
|
|
7368
|
+
}
|
|
7369
|
+
},
|
|
7370
|
+
UpdateOrganizationUserRequest: {
|
|
7371
|
+
type: "object",
|
|
7372
|
+
description: "Changes to a member. Send `role`, `groups`, or both; an omitted field is left as it is.",
|
|
7373
|
+
additionalProperties: false,
|
|
7374
|
+
minProperties: 1,
|
|
7375
|
+
properties: {
|
|
7376
|
+
role: {
|
|
7377
|
+
$ref: "#/$defs/OrganizationRoleInput"
|
|
5844
7378
|
},
|
|
5845
|
-
|
|
5846
|
-
type: "
|
|
5847
|
-
|
|
5848
|
-
|
|
5849
|
-
|
|
5850
|
-
|
|
7379
|
+
groups: {
|
|
7380
|
+
type: "array",
|
|
7381
|
+
description: "The member's groups after the change: the whole set, by ID. An empty list removes the member from every group.",
|
|
7382
|
+
uniqueItems: true,
|
|
7383
|
+
items: {
|
|
7384
|
+
$ref: "#/$defs/OrganizationGroupInput"
|
|
7385
|
+
}
|
|
5851
7386
|
}
|
|
5852
7387
|
}
|
|
5853
7388
|
}
|
|
@@ -5858,7 +7393,7 @@ var generatedTools = [
|
|
|
5858
7393
|
name: "update-pod",
|
|
5859
7394
|
title: "Update Pod",
|
|
5860
7395
|
operationId: "updatePod",
|
|
5861
|
-
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.",
|
|
7396
|
+
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.",
|
|
5862
7397
|
method: "PATCH",
|
|
5863
7398
|
path: "/v2/pods/{id}",
|
|
5864
7399
|
params: [
|
|
@@ -5952,21 +7487,6 @@ var generatedTools = [
|
|
|
5952
7487
|
}
|
|
5953
7488
|
}
|
|
5954
7489
|
},
|
|
5955
|
-
BaseMounts: {
|
|
5956
|
-
type: "object",
|
|
5957
|
-
properties: {
|
|
5958
|
-
persistent: {
|
|
5959
|
-
$ref: "#/$defs/PersistentMount"
|
|
5960
|
-
},
|
|
5961
|
-
network: {
|
|
5962
|
-
type: "array",
|
|
5963
|
-
maxItems: 1,
|
|
5964
|
-
items: {
|
|
5965
|
-
$ref: "#/$defs/NetworkMount"
|
|
5966
|
-
}
|
|
5967
|
-
}
|
|
5968
|
-
}
|
|
5969
|
-
},
|
|
5970
7490
|
ContainerConfig: {
|
|
5971
7491
|
allOf: [
|
|
5972
7492
|
{
|
|
@@ -5984,11 +7504,11 @@ var generatedTools = [
|
|
|
5984
7504
|
}
|
|
5985
7505
|
]
|
|
5986
7506
|
},
|
|
5987
|
-
|
|
7507
|
+
GlobalMountPatch: {
|
|
5988
7508
|
type: "object",
|
|
5989
7509
|
required: ["volumeId"],
|
|
5990
7510
|
additionalProperties: false,
|
|
5991
|
-
description: "
|
|
7511
|
+
description: "Mounts, moves, or unmounts the pod's global volume.",
|
|
5992
7512
|
properties: {
|
|
5993
7513
|
volumeId: {
|
|
5994
7514
|
type: "string",
|
|
@@ -5997,38 +7517,21 @@ var generatedTools = [
|
|
|
5997
7517
|
},
|
|
5998
7518
|
path: {
|
|
5999
7519
|
type: "string",
|
|
6000
|
-
|
|
7520
|
+
minLength: 1,
|
|
7521
|
+
description: "Mount path inside the container. Optional; when mounting, a default is chosen for you if omitted.",
|
|
6001
7522
|
examples: ["/data"]
|
|
6002
|
-
}
|
|
6003
|
-
}
|
|
6004
|
-
},
|
|
6005
|
-
Mounts: {
|
|
6006
|
-
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.",
|
|
6007
|
-
allOf: [
|
|
6008
|
-
{
|
|
6009
|
-
$ref: "#/$defs/BaseMounts"
|
|
6010
7523
|
},
|
|
6011
|
-
{
|
|
6012
|
-
type: "
|
|
6013
|
-
|
|
6014
|
-
global: {
|
|
6015
|
-
type: "array",
|
|
6016
|
-
maxItems: 1,
|
|
6017
|
-
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.",
|
|
6018
|
-
items: {
|
|
6019
|
-
$ref: "#/$defs/GlobalMount"
|
|
6020
|
-
}
|
|
6021
|
-
}
|
|
6022
|
-
}
|
|
7524
|
+
remove: {
|
|
7525
|
+
type: "boolean",
|
|
7526
|
+
description: "Unmount the volume. Cannot be combined with `path`."
|
|
6023
7527
|
}
|
|
6024
|
-
|
|
6025
|
-
unevaluatedProperties: false
|
|
7528
|
+
}
|
|
6026
7529
|
},
|
|
6027
|
-
|
|
7530
|
+
NetworkMountPatch: {
|
|
6028
7531
|
type: "object",
|
|
6029
|
-
required: ["volumeId"
|
|
7532
|
+
required: ["volumeId"],
|
|
6030
7533
|
additionalProperties: false,
|
|
6031
|
-
description: "
|
|
7534
|
+
description: "Mounts, moves, or unmounts one network volume. Mounting a volume the pod does not have requires `path`.",
|
|
6032
7535
|
properties: {
|
|
6033
7536
|
volumeId: {
|
|
6034
7537
|
type: "string",
|
|
@@ -6037,27 +7540,62 @@ var generatedTools = [
|
|
|
6037
7540
|
},
|
|
6038
7541
|
path: {
|
|
6039
7542
|
type: "string",
|
|
6040
|
-
|
|
7543
|
+
minLength: 1,
|
|
7544
|
+
description: "Mount path inside the container. Required when mounting; optional when moving a mounted volume.",
|
|
6041
7545
|
examples: ["/runpod-volume"]
|
|
7546
|
+
},
|
|
7547
|
+
remove: {
|
|
7548
|
+
type: "boolean",
|
|
7549
|
+
description: "Unmount the volume. Cannot be combined with `path`."
|
|
6042
7550
|
}
|
|
6043
7551
|
}
|
|
6044
7552
|
},
|
|
6045
|
-
|
|
7553
|
+
PersistentMountPatch: {
|
|
6046
7554
|
type: "object",
|
|
6047
|
-
required: ["size", "path"],
|
|
6048
7555
|
additionalProperties: false,
|
|
6049
|
-
description: "
|
|
7556
|
+
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.",
|
|
6050
7557
|
properties: {
|
|
6051
7558
|
size: {
|
|
6052
7559
|
type: "integer",
|
|
6053
7560
|
minimum: 10,
|
|
6054
|
-
description: "
|
|
6055
|
-
examples: [
|
|
7561
|
+
description: "Volume disk size in GB. Can only grow; a smaller size than the current one is rejected.",
|
|
7562
|
+
examples: [50]
|
|
6056
7563
|
},
|
|
6057
7564
|
path: {
|
|
6058
7565
|
type: "string",
|
|
6059
|
-
|
|
7566
|
+
minLength: 1,
|
|
7567
|
+
description: "Mount path inside the container.",
|
|
6060
7568
|
examples: ["/workspace"]
|
|
7569
|
+
},
|
|
7570
|
+
remove: {
|
|
7571
|
+
type: "boolean",
|
|
7572
|
+
description: "Removes the volume disk. Not supported yet: `remove: true` is rejected."
|
|
7573
|
+
}
|
|
7574
|
+
}
|
|
7575
|
+
},
|
|
7576
|
+
UpdatePodMounts: {
|
|
7577
|
+
type: "object",
|
|
7578
|
+
additionalProperties: false,
|
|
7579
|
+
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.",
|
|
7580
|
+
properties: {
|
|
7581
|
+
persistent: {
|
|
7582
|
+
$ref: "#/$defs/PersistentMountPatch"
|
|
7583
|
+
},
|
|
7584
|
+
network: {
|
|
7585
|
+
type: "array",
|
|
7586
|
+
maxItems: 8,
|
|
7587
|
+
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.",
|
|
7588
|
+
items: {
|
|
7589
|
+
$ref: "#/$defs/NetworkMountPatch"
|
|
7590
|
+
}
|
|
7591
|
+
},
|
|
7592
|
+
global: {
|
|
7593
|
+
type: "array",
|
|
7594
|
+
maxItems: 2,
|
|
7595
|
+
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.",
|
|
7596
|
+
items: {
|
|
7597
|
+
$ref: "#/$defs/GlobalMountPatch"
|
|
7598
|
+
}
|
|
6061
7599
|
}
|
|
6062
7600
|
}
|
|
6063
7601
|
},
|
|
@@ -6078,7 +7616,7 @@ var generatedTools = [
|
|
|
6078
7616
|
description: "Lock the pod (true) or unlock it (false). Locked pods cannot be stopped or reset."
|
|
6079
7617
|
},
|
|
6080
7618
|
mounts: {
|
|
6081
|
-
$ref: "#/$defs/
|
|
7619
|
+
$ref: "#/$defs/UpdatePodMounts"
|
|
6082
7620
|
},
|
|
6083
7621
|
name: {
|
|
6084
7622
|
type: "string",
|
|
@@ -6325,7 +7863,7 @@ var generatedTools = [
|
|
|
6325
7863
|
size: {
|
|
6326
7864
|
type: "integer",
|
|
6327
7865
|
minimum: 10,
|
|
6328
|
-
description: "Host-local persistent storage in GB.
|
|
7866
|
+
description: "Host-local persistent storage in GB. Minimum 10 GB.",
|
|
6329
7867
|
examples: [20]
|
|
6330
7868
|
},
|
|
6331
7869
|
path: {
|
|
@@ -6585,33 +8123,53 @@ var CREDENTIAL_MANAGEMENT = "Manages stored credentials; OpenAI restricts plugin
|
|
|
6585
8123
|
var CREDENTIAL_INPUT = "Takes a secret or password as input; directories forbid collecting credentials.";
|
|
6586
8124
|
var ALP = "Collects conversation-derived data beyond the task; the directory profile never serves it.";
|
|
6587
8125
|
var DIRECTORY_TOOLS = {
|
|
8126
|
+
"add-organization-group-member": IN,
|
|
8127
|
+
"attach-cost-center-resource": IN,
|
|
6588
8128
|
"cancel-job": IN,
|
|
6589
8129
|
"create-cluster": IN,
|
|
8130
|
+
"create-cost-center": IN,
|
|
6590
8131
|
"create-delegation": IN,
|
|
6591
8132
|
"create-endpoint": IN,
|
|
6592
8133
|
"create-global-volume": IN,
|
|
6593
8134
|
"create-network-volume": IN,
|
|
8135
|
+
"create-organization-group": IN,
|
|
8136
|
+
"create-organization-invite": IN,
|
|
8137
|
+
"create-organization-role": IN,
|
|
6594
8138
|
"create-pod": IN,
|
|
6595
8139
|
"create-template": IN,
|
|
6596
8140
|
"delete-cluster": IN,
|
|
8141
|
+
"delete-cost-center": IN,
|
|
6597
8142
|
"delete-endpoint": IN,
|
|
6598
8143
|
"delete-global-volume": IN,
|
|
6599
8144
|
"delete-network-volume": IN,
|
|
8145
|
+
"delete-organization-group": IN,
|
|
8146
|
+
"delete-organization-invite": IN,
|
|
8147
|
+
"delete-organization-role": IN,
|
|
8148
|
+
"delete-organization-user": IN,
|
|
6600
8149
|
"delete-pod": IN,
|
|
6601
8150
|
"delete-template": IN,
|
|
6602
8151
|
"deploy-hub-repo": IN,
|
|
8152
|
+
"detach-cost-center-resource": IN,
|
|
6603
8153
|
"endpoint-health": IN,
|
|
6604
8154
|
"get-capacity": IN,
|
|
6605
8155
|
"get-cluster": IN,
|
|
8156
|
+
"get-cost-center": IN,
|
|
6606
8157
|
"get-cpu-type": IN,
|
|
6607
8158
|
"get-data-center": IN,
|
|
6608
8159
|
"get-endpoint": IN,
|
|
6609
8160
|
"get-endpoint-build": IN,
|
|
8161
|
+
"get-endpoint-cold-start-metrics": IN,
|
|
8162
|
+
"get-endpoint-request-metrics": IN,
|
|
8163
|
+
"get-endpoint-worker-metrics": IN,
|
|
6610
8164
|
"get-global-volume": IN,
|
|
6611
8165
|
"get-gpu-type": IN,
|
|
6612
8166
|
"get-job-status": IN,
|
|
6613
8167
|
"get-network-volume": IN,
|
|
6614
8168
|
"get-organization": IN,
|
|
8169
|
+
"get-organization-group": IN,
|
|
8170
|
+
"get-organization-invite": IN,
|
|
8171
|
+
"get-organization-role": IN,
|
|
8172
|
+
"get-organization-role-capabilities": IN,
|
|
6615
8173
|
"get-organization-user": IN,
|
|
6616
8174
|
"get-pod": IN,
|
|
6617
8175
|
"get-ssh-keys": IN,
|
|
@@ -6621,6 +8179,8 @@ var DIRECTORY_TOOLS = {
|
|
|
6621
8179
|
"list-cluster-billing": IN,
|
|
6622
8180
|
"list-cluster-pods": IN,
|
|
6623
8181
|
"list-clusters": IN,
|
|
8182
|
+
"list-cost-center-resources": IN,
|
|
8183
|
+
"list-cost-centers": IN,
|
|
6624
8184
|
"list-cpu-types": IN,
|
|
6625
8185
|
"list-data-centers": IN,
|
|
6626
8186
|
"list-delegations": IN,
|
|
@@ -6634,6 +8194,10 @@ var DIRECTORY_TOOLS = {
|
|
|
6634
8194
|
"list-hub-repos": IN,
|
|
6635
8195
|
"list-network-volume-billing": IN,
|
|
6636
8196
|
"list-network-volumes": IN,
|
|
8197
|
+
"list-organization-group-members": IN,
|
|
8198
|
+
"list-organization-groups": IN,
|
|
8199
|
+
"list-organization-invites": IN,
|
|
8200
|
+
"list-organization-roles": IN,
|
|
6637
8201
|
"list-organization-users": IN,
|
|
6638
8202
|
"list-pod-billing": IN,
|
|
6639
8203
|
"list-pods": IN,
|
|
@@ -6643,6 +8207,7 @@ var DIRECTORY_TOOLS = {
|
|
|
6643
8207
|
"list-templates": IN,
|
|
6644
8208
|
"lookup-concept": IN,
|
|
6645
8209
|
"purge-endpoint-queue": IN,
|
|
8210
|
+
"remove-organization-group-member": IN,
|
|
6646
8211
|
"retry-job": IN,
|
|
6647
8212
|
"revoke-delegation": IN,
|
|
6648
8213
|
"search-concepts": IN,
|
|
@@ -6652,9 +8217,13 @@ var DIRECTORY_TOOLS = {
|
|
|
6652
8217
|
"stream-pod-logs": IN,
|
|
6653
8218
|
"stream-worker-logs": IN,
|
|
6654
8219
|
"update-cluster": IN,
|
|
8220
|
+
"update-cost-center": IN,
|
|
6655
8221
|
"update-endpoint": IN,
|
|
6656
8222
|
"update-global-volume": IN,
|
|
6657
8223
|
"update-network-volume": IN,
|
|
8224
|
+
"update-organization-group": IN,
|
|
8225
|
+
"update-organization-role": IN,
|
|
8226
|
+
"update-organization-user": IN,
|
|
6658
8227
|
"update-pod": IN,
|
|
6659
8228
|
"update-ssh-keys": IN,
|
|
6660
8229
|
"update-template": IN,
|
|
@@ -9455,23 +11024,40 @@ function createRunpodClient(options = {}) {
|
|
|
9455
11024
|
// src/specgen/clients/sse.ts
|
|
9456
11025
|
var LOG_STREAM_DEFAULT_WAIT_MS = 5e3;
|
|
9457
11026
|
var LOG_STREAM_MAX_BYTES = 256 * 1024;
|
|
11027
|
+
var LOG_STREAM_CONNECT_TIMEOUT_MS = 1e4;
|
|
11028
|
+
var LOG_SNAPSHOT_MAX_CHARS = 32e3;
|
|
9458
11029
|
function createSseReader(options = {}) {
|
|
9459
11030
|
const apiKey = options.apiKey ?? process.env.RUNPOD_API_KEY;
|
|
9460
11031
|
const fetchImpl = options.fetchImpl ?? fetch;
|
|
11032
|
+
const connectTimeoutMs = options.connectTimeoutMs ?? LOG_STREAM_CONNECT_TIMEOUT_MS;
|
|
9461
11033
|
return async (url, opts) => {
|
|
9462
11034
|
if (!apiKey) throw missingKeyError();
|
|
9463
11035
|
const chunks = [];
|
|
9464
11036
|
let bytes = 0;
|
|
9465
11037
|
let truncated = false;
|
|
9466
11038
|
let streamEstablished = false;
|
|
11039
|
+
const connect = new AbortController();
|
|
11040
|
+
const connectTimer = setTimeout(
|
|
11041
|
+
() => connect.abort(
|
|
11042
|
+
new DOMException(
|
|
11043
|
+
`Runpod log stream sent no headers within ${connectTimeoutMs}ms`,
|
|
11044
|
+
"TimeoutError"
|
|
11045
|
+
)
|
|
11046
|
+
),
|
|
11047
|
+
connectTimeoutMs
|
|
11048
|
+
);
|
|
9467
11049
|
try {
|
|
9468
|
-
const response = await createDeadlineFetch(
|
|
11050
|
+
const response = await createDeadlineFetch(
|
|
11051
|
+
fetchImpl,
|
|
11052
|
+
connectTimeoutMs + opts.maxWaitMs
|
|
11053
|
+
)(url, {
|
|
9469
11054
|
method: "GET",
|
|
9470
11055
|
headers: {
|
|
9471
11056
|
Authorization: `Bearer ${apiKey}`,
|
|
9472
11057
|
Accept: "text/event-stream"
|
|
9473
|
-
}
|
|
9474
|
-
|
|
11058
|
+
},
|
|
11059
|
+
signal: connect.signal
|
|
11060
|
+
}).finally(() => clearTimeout(connectTimer));
|
|
9475
11061
|
if (!response.ok) {
|
|
9476
11062
|
const body = await response.text().catch(() => "");
|
|
9477
11063
|
throw new HttpError(
|
|
@@ -9482,14 +11068,31 @@ function createSseReader(options = {}) {
|
|
|
9482
11068
|
}
|
|
9483
11069
|
streamEstablished = true;
|
|
9484
11070
|
if (response.body) {
|
|
9485
|
-
|
|
9486
|
-
|
|
9487
|
-
|
|
9488
|
-
|
|
9489
|
-
|
|
9490
|
-
|
|
9491
|
-
|
|
11071
|
+
const reader = response.body.getReader();
|
|
11072
|
+
let timer;
|
|
11073
|
+
const windowClosed = new Promise((resolve2) => {
|
|
11074
|
+
timer = setTimeout(() => resolve2(null), opts.maxWaitMs);
|
|
11075
|
+
});
|
|
11076
|
+
try {
|
|
11077
|
+
for (; ; ) {
|
|
11078
|
+
const read = reader.read();
|
|
11079
|
+
read.catch(() => {
|
|
11080
|
+
});
|
|
11081
|
+
const next = await Promise.race([read, windowClosed]);
|
|
11082
|
+
if (next === null || next.done) break;
|
|
11083
|
+
const boundedChunk = next.value.subarray(0, opts.maxBytes - bytes);
|
|
11084
|
+
chunks.push(boundedChunk);
|
|
11085
|
+
bytes += boundedChunk.length;
|
|
11086
|
+
if (bytes >= opts.maxBytes) {
|
|
11087
|
+
truncated = true;
|
|
11088
|
+
break;
|
|
11089
|
+
}
|
|
9492
11090
|
}
|
|
11091
|
+
} finally {
|
|
11092
|
+
clearTimeout(timer);
|
|
11093
|
+
void reader.cancel().catch(() => {
|
|
11094
|
+
});
|
|
11095
|
+
reader.releaseLock();
|
|
9493
11096
|
}
|
|
9494
11097
|
}
|
|
9495
11098
|
} catch (err) {
|
|
@@ -9515,7 +11118,80 @@ async function collectLogSnapshot(reader, logsUrl, params) {
|
|
|
9515
11118
|
for await (const event of iterateLogEvents(new Response(raw).body)) {
|
|
9516
11119
|
items.push(event.data);
|
|
9517
11120
|
}
|
|
9518
|
-
return
|
|
11121
|
+
return fitSnapshot(items, truncated);
|
|
11122
|
+
}
|
|
11123
|
+
var serializedLength = (snapshot) => JSON.stringify(snapshot, null, 2).length;
|
|
11124
|
+
var LOG_ENTRY_MAX_CHARS = 16e3;
|
|
11125
|
+
var CLIPPABLE_KEYS = ["line", "raw"];
|
|
11126
|
+
function clipText(text, keep) {
|
|
11127
|
+
const code = text.charCodeAt(keep - 1);
|
|
11128
|
+
if (keep > 0 && code >= 55296 && code <= 56319) keep--;
|
|
11129
|
+
return `${text.slice(0, keep)}\u2026 [clipped ${text.length - keep} chars]`;
|
|
11130
|
+
}
|
|
11131
|
+
function clipEntry(entry) {
|
|
11132
|
+
let clipped = false;
|
|
11133
|
+
const out = { ...entry };
|
|
11134
|
+
for (const key of CLIPPABLE_KEYS) {
|
|
11135
|
+
const text = out[key];
|
|
11136
|
+
if (typeof text === "string" && text.length > LOG_ENTRY_MAX_CHARS) {
|
|
11137
|
+
out[key] = clipText(text, LOG_ENTRY_MAX_CHARS);
|
|
11138
|
+
clipped = true;
|
|
11139
|
+
}
|
|
11140
|
+
}
|
|
11141
|
+
return { entry: out, clipped };
|
|
11142
|
+
}
|
|
11143
|
+
function fitEntry(entry, maxChars) {
|
|
11144
|
+
const size = (e) => serializedLength({ items: [e], count: 1, truncated: false });
|
|
11145
|
+
const out = { ...entry };
|
|
11146
|
+
const keys = Object.keys(out).filter((key) => key !== "ts" && typeof out[key] === "string").sort((a, b) => out[b].length - out[a].length);
|
|
11147
|
+
for (const key of keys) {
|
|
11148
|
+
if (size(out) <= maxChars) break;
|
|
11149
|
+
const text = entry[key];
|
|
11150
|
+
let lo = 0;
|
|
11151
|
+
let hi = Math.min(text.length, LOG_ENTRY_MAX_CHARS);
|
|
11152
|
+
while (lo < hi) {
|
|
11153
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
11154
|
+
if (size({ ...out, [key]: clipText(text, mid) }) <= maxChars)
|
|
11155
|
+
lo = mid;
|
|
11156
|
+
else hi = mid - 1;
|
|
11157
|
+
}
|
|
11158
|
+
out[key] = clipText(text, lo);
|
|
11159
|
+
}
|
|
11160
|
+
return out;
|
|
11161
|
+
}
|
|
11162
|
+
var entryTs = (entry) => entry?.ts;
|
|
11163
|
+
function fitSnapshot(items, truncated, maxChars = LOG_SNAPSHOT_MAX_CHARS) {
|
|
11164
|
+
let cut = truncated;
|
|
11165
|
+
const entries = items.map((item) => {
|
|
11166
|
+
const { entry, clipped } = clipEntry(item);
|
|
11167
|
+
if (clipped) cut = true;
|
|
11168
|
+
return entry;
|
|
11169
|
+
});
|
|
11170
|
+
const snapshot = (n, isCut) => ({
|
|
11171
|
+
items: entries.slice(0, n),
|
|
11172
|
+
count: n,
|
|
11173
|
+
truncated: isCut
|
|
11174
|
+
});
|
|
11175
|
+
const whole = snapshot(entries.length, cut);
|
|
11176
|
+
if (entries.length === 0 || serializedLength(whole) <= maxChars) return whole;
|
|
11177
|
+
if (serializedLength(snapshot(1, true)) > maxChars) {
|
|
11178
|
+
entries[0] = fitEntry(items[0], maxChars);
|
|
11179
|
+
if (entries.length === 1) return snapshot(1, true);
|
|
11180
|
+
}
|
|
11181
|
+
let lo = 1;
|
|
11182
|
+
let hi = entries.length - 1;
|
|
11183
|
+
while (lo < hi) {
|
|
11184
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
11185
|
+
if (serializedLength(snapshot(mid, true)) <= maxChars) lo = mid;
|
|
11186
|
+
else hi = mid - 1;
|
|
11187
|
+
}
|
|
11188
|
+
let keep = lo;
|
|
11189
|
+
const omittedTs = entryTs(entries[keep]);
|
|
11190
|
+
if (omittedTs !== void 0) {
|
|
11191
|
+
while (keep > 0 && entryTs(entries[keep - 1]) === omittedTs) keep--;
|
|
11192
|
+
if (keep === 0) keep = lo;
|
|
11193
|
+
}
|
|
11194
|
+
return snapshot(keep, true);
|
|
9519
11195
|
}
|
|
9520
11196
|
|
|
9521
11197
|
// src/specgen/tools/logs.ts
|
|
@@ -9533,13 +11209,13 @@ var logStreamProperties = {
|
|
|
9533
11209
|
},
|
|
9534
11210
|
since: {
|
|
9535
11211
|
type: "string",
|
|
9536
|
-
description: "RFC3339 timestamp to resume
|
|
11212
|
+
description: "RFC3339 timestamp to resume after (exclusive). Replays container lines only; system lines stream live from the call. When set, `tail` is ignored."
|
|
9537
11213
|
},
|
|
9538
11214
|
maxWaitMs: {
|
|
9539
11215
|
type: "integer",
|
|
9540
11216
|
minimum: 500,
|
|
9541
11217
|
maximum: 3e4,
|
|
9542
|
-
description: "How long to read the stream, in ms (default 5000, max 30000)"
|
|
11218
|
+
description: "How long to read the stream once it opens, in ms (default 5000, max 30000)"
|
|
9543
11219
|
}
|
|
9544
11220
|
};
|
|
9545
11221
|
function baseUrl() {
|
|
@@ -9565,7 +11241,7 @@ var streamPodLogs = {
|
|
|
9565
11241
|
title: "Stream Pod logs",
|
|
9566
11242
|
holdsResponse: true,
|
|
9567
11243
|
annotations: readOnly,
|
|
9568
|
-
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
|
|
11244
|
+
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`.",
|
|
9569
11245
|
inputSchema: {
|
|
9570
11246
|
type: "object",
|
|
9571
11247
|
properties: {
|
|
@@ -9587,10 +11263,10 @@ var streamPodLogs = {
|
|
|
9587
11263
|
var streamWorkerLogs = {
|
|
9588
11264
|
name: "stream-worker-logs",
|
|
9589
11265
|
title: "Stream worker logs",
|
|
9590
|
-
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
|
|
11266
|
+
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.",
|
|
9591
11267
|
holdsResponse: true,
|
|
9592
11268
|
annotations: readOnly,
|
|
9593
|
-
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
|
|
11269
|
+
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.",
|
|
9594
11270
|
inputSchema: {
|
|
9595
11271
|
type: "object",
|
|
9596
11272
|
properties: {
|
|
@@ -9734,6 +11410,24 @@ var listPublicEndpoints = {
|
|
|
9734
11410
|
// src/specgen/tools/knowledge.ts
|
|
9735
11411
|
var import_plugin_knowledge = require("@runpod/plugin-knowledge");
|
|
9736
11412
|
var knowledge = (0, import_plugin_knowledge.loadKnowledge)();
|
|
11413
|
+
var resolveGuideId = (id) => knowledge.aliases?.[id] ?? id;
|
|
11414
|
+
var hiddenRules = new Set(
|
|
11415
|
+
(process.env.KNOWLEDGE_HIDDEN_RULES ?? "").split(",").map((id) => id.trim()).filter(Boolean)
|
|
11416
|
+
);
|
|
11417
|
+
var concepts = knowledge.concepts.map((concept) => ({
|
|
11418
|
+
...concept,
|
|
11419
|
+
rules: concept.rules.filter((rule) => !hiddenRules.has(rule.id))
|
|
11420
|
+
}));
|
|
11421
|
+
for (const id of hiddenRules) {
|
|
11422
|
+
if (!knowledge.concepts.some(
|
|
11423
|
+
(concept) => concept.rules.some((rule) => rule.id === id)
|
|
11424
|
+
))
|
|
11425
|
+
console.warn("knowledge_hidden_rule_unknown", {
|
|
11426
|
+
id,
|
|
11427
|
+
plugin_version: knowledge.version
|
|
11428
|
+
});
|
|
11429
|
+
}
|
|
11430
|
+
var visibleRuleIds = (ids) => ids.filter((id) => !hiddenRules.has(id));
|
|
9737
11431
|
var GUIDE_KINDS = ["skill", "reference", "golden-path"];
|
|
9738
11432
|
var STOPWORDS = new Set(
|
|
9739
11433
|
"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(
|
|
@@ -9776,7 +11470,7 @@ var guideSummary = ({
|
|
|
9776
11470
|
lanes,
|
|
9777
11471
|
mcp,
|
|
9778
11472
|
needs_shell,
|
|
9779
|
-
concepts
|
|
11473
|
+
concepts: concepts2
|
|
9780
11474
|
}) => ({
|
|
9781
11475
|
id,
|
|
9782
11476
|
kind,
|
|
@@ -9785,7 +11479,7 @@ var guideSummary = ({
|
|
|
9785
11479
|
lanes,
|
|
9786
11480
|
mcp,
|
|
9787
11481
|
needs_shell,
|
|
9788
|
-
concepts
|
|
11482
|
+
concepts: concepts2
|
|
9789
11483
|
});
|
|
9790
11484
|
function linkedGuides(conceptId) {
|
|
9791
11485
|
const byId = new Map(knowledge.guides.map((guide) => [guide.id, guide]));
|
|
@@ -9797,19 +11491,20 @@ function linkedGuides(conceptId) {
|
|
|
9797
11491
|
seen.add(link.from);
|
|
9798
11492
|
const guide = byId.get(link.from);
|
|
9799
11493
|
if (!guide) continue;
|
|
11494
|
+
const rules = link.rules && visibleRuleIds(link.rules);
|
|
9800
11495
|
if (guide.kind === "golden-path")
|
|
9801
11496
|
examples.push({ id: guide.id, title: guide.title, mcp: guide.mcp });
|
|
9802
11497
|
else
|
|
9803
11498
|
docs.push({
|
|
9804
11499
|
id: guide.id,
|
|
9805
11500
|
title: guide.title,
|
|
9806
|
-
...
|
|
11501
|
+
...rules?.length ? { rules } : {}
|
|
9807
11502
|
});
|
|
9808
11503
|
}
|
|
9809
11504
|
return { examples, docs };
|
|
9810
11505
|
}
|
|
9811
11506
|
var conceptIndex = /* @__PURE__ */ new Map();
|
|
9812
|
-
for (const concept of
|
|
11507
|
+
for (const concept of concepts) {
|
|
9813
11508
|
for (const key of [concept.id, concept.name, ...concept.aliases]) {
|
|
9814
11509
|
if (!conceptIndex.has(key.toLowerCase()))
|
|
9815
11510
|
conceptIndex.set(key.toLowerCase(), concept);
|
|
@@ -9843,7 +11538,7 @@ function resolveConcept(input) {
|
|
|
9843
11538
|
return best && !tied ? { concept: best.concept, matchedAs: best.key } : void 0;
|
|
9844
11539
|
}
|
|
9845
11540
|
var ruleIndex = /* @__PURE__ */ new Map();
|
|
9846
|
-
for (const concept of
|
|
11541
|
+
for (const concept of concepts) {
|
|
9847
11542
|
for (const rule of concept.rules) ruleIndex.set(rule.id, { rule, concept });
|
|
9848
11543
|
}
|
|
9849
11544
|
var source = {
|
|
@@ -9892,7 +11587,9 @@ var readGuide = {
|
|
|
9892
11587
|
title: "Read guide",
|
|
9893
11588
|
annotations: bundledRead,
|
|
9894
11589
|
recordedArguments: ["id"],
|
|
9895
|
-
recordedGuideKind: (args) => knowledge.guides.find(
|
|
11590
|
+
recordedGuideKind: (args) => knowledge.guides.find(
|
|
11591
|
+
(guide) => guide.id === resolveGuideId(String(args.id).trim())
|
|
11592
|
+
)?.kind,
|
|
9896
11593
|
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").',
|
|
9897
11594
|
inputSchema: {
|
|
9898
11595
|
type: "object",
|
|
@@ -9904,7 +11601,9 @@ var readGuide = {
|
|
|
9904
11601
|
},
|
|
9905
11602
|
handler: async (_ctx, args) => {
|
|
9906
11603
|
const id = String(args.id).trim();
|
|
9907
|
-
const guide = knowledge.guides.find(
|
|
11604
|
+
const guide = knowledge.guides.find(
|
|
11605
|
+
(candidate) => candidate.id === resolveGuideId(id)
|
|
11606
|
+
);
|
|
9908
11607
|
if (!guide) {
|
|
9909
11608
|
const close = knowledge.guides.filter(
|
|
9910
11609
|
(candidate) => candidate.id.includes(id) || id.includes(candidate.id)
|
|
@@ -9962,7 +11661,7 @@ var lookupConcept = {
|
|
|
9962
11661
|
};
|
|
9963
11662
|
}
|
|
9964
11663
|
const { concept, matchedAs } = resolved;
|
|
9965
|
-
const pointedAtBy =
|
|
11664
|
+
const pointedAtBy = concepts.flatMap((other) => [
|
|
9966
11665
|
...other.is_a === concept.id ? [{ concept: other.id, type: "is_a" }] : [],
|
|
9967
11666
|
...other.part_of === concept.id ? [{ concept: other.id, type: "part_of" }] : [],
|
|
9968
11667
|
...other.relations.filter((relation) => relation.target === concept.id).map((relation) => ({ concept: other.id, type: relation.type }))
|
|
@@ -9976,6 +11675,14 @@ var lookupConcept = {
|
|
|
9976
11675
|
...source,
|
|
9977
11676
|
...matchedAs ? { matched_as: matchedAs } : {},
|
|
9978
11677
|
...concept,
|
|
11678
|
+
steps: concept.steps.map((step) => ({
|
|
11679
|
+
...step,
|
|
11680
|
+
rules: visibleRuleIds(step.rules)
|
|
11681
|
+
})),
|
|
11682
|
+
rules: concept.rules.map((rule) => ({
|
|
11683
|
+
...rule,
|
|
11684
|
+
see: visibleRuleIds(rule.see)
|
|
11685
|
+
})),
|
|
9979
11686
|
pointed_at_by: pointedAtBy,
|
|
9980
11687
|
linked_rules: linkedRules,
|
|
9981
11688
|
...linkedGuides(concept.id)
|
|
@@ -10051,6 +11758,12 @@ var guideResources = knowledge.guides.map((guide) => ({
|
|
|
10051
11758
|
mimeType: "text/markdown",
|
|
10052
11759
|
text: guide.body
|
|
10053
11760
|
}));
|
|
11761
|
+
var findGuideResource = (resources, uri) => {
|
|
11762
|
+
const id = uri.startsWith(GUIDE_URI_PREFIX) ? resolveGuideId(uri.slice(GUIDE_URI_PREFIX.length)) : void 0;
|
|
11763
|
+
return resources.find(
|
|
11764
|
+
(resource) => resource.uri === uri || resource.uri === GUIDE_URI_PREFIX + id
|
|
11765
|
+
);
|
|
11766
|
+
};
|
|
10054
11767
|
|
|
10055
11768
|
// src/specgen/prose.ts
|
|
10056
11769
|
var ABBREVIATIONS = ["e.g.", "i.e.", "etc.", "vs."];
|
|
@@ -10298,6 +12011,7 @@ function captureToolCall(apiKey, event) {
|
|
|
10298
12011
|
server_version: event.serverVersion,
|
|
10299
12012
|
...event.clientName ? { client_name: event.clientName } : {},
|
|
10300
12013
|
...event.guideKind ? { guide_kind: event.guideKind } : {},
|
|
12014
|
+
...event.errorClass ? { error_class: event.errorClass } : {},
|
|
10301
12015
|
...event.blockedBy ? { blocked_by: event.blockedBy } : {},
|
|
10302
12016
|
...event.profile ? { profile: event.profile } : {},
|
|
10303
12017
|
...args
|
|
@@ -11076,7 +12790,7 @@ These tools manage infrastructure only. They do not do SSH sessions, file transf
|
|
|
11076
12790
|
|
|
11077
12791
|
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.
|
|
11078
12792
|
|
|
11079
|
-
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.
|
|
12793
|
+
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.
|
|
11080
12794
|
|
|
11081
12795
|
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.
|
|
11082
12796
|
|
|
@@ -11137,9 +12851,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
11137
12851
|
resourceTemplates: []
|
|
11138
12852
|
}));
|
|
11139
12853
|
server.setRequestHandler(import_types2.ReadResourceRequestSchema, async (request) => {
|
|
11140
|
-
const guide = servedGuides.
|
|
11141
|
-
(candidate) => candidate.uri === request.params.uri
|
|
11142
|
-
);
|
|
12854
|
+
const guide = findGuideResource(servedGuides, request.params.uri);
|
|
11143
12855
|
if (opts.analytics) {
|
|
11144
12856
|
captureResourceCall(ctx.apiKey, {
|
|
11145
12857
|
method: "resources/read",
|
|
@@ -11176,6 +12888,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
11176
12888
|
ok: false,
|
|
11177
12889
|
status: 429,
|
|
11178
12890
|
durationMs: 0,
|
|
12891
|
+
errorClass: "rate_limited",
|
|
11179
12892
|
...verdict.reason ? { blockedBy: verdict.reason } : {},
|
|
11180
12893
|
profile,
|
|
11181
12894
|
...opts.analytics
|
|
@@ -11201,6 +12914,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
11201
12914
|
const generated = servedGeneratedTools.find(
|
|
11202
12915
|
(tool) => tool.name === request.params.name
|
|
11203
12916
|
);
|
|
12917
|
+
const curatedArgs = curated ? withoutNullOptionals(curated.inputSchema, args) : args;
|
|
11204
12918
|
const omitted = directory ? directoryOmittedInputs(request.params.name).filter((key) => key in args) : [];
|
|
11205
12919
|
const rejected = omitted.length ? {
|
|
11206
12920
|
ok: false,
|
|
@@ -11210,10 +12924,10 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
11210
12924
|
}
|
|
11211
12925
|
} : curated && !curated.lenientArguments ? validateArguments(
|
|
11212
12926
|
curated.inputSchema,
|
|
11213
|
-
|
|
12927
|
+
curatedArgs
|
|
11214
12928
|
) : null;
|
|
11215
12929
|
const result = rejected ?? await runTool(
|
|
11216
|
-
() => curated ? curated.handler(ctx,
|
|
12930
|
+
() => curated ? curated.handler(ctx, curatedArgs) : dispatchTool(generated, request.params.name, args)
|
|
11217
12931
|
);
|
|
11218
12932
|
logToolCall({
|
|
11219
12933
|
tool: request.params.name,
|
|
@@ -11228,6 +12942,7 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
11228
12942
|
ok: result.ok,
|
|
11229
12943
|
status: result.status,
|
|
11230
12944
|
durationMs: Date.now() - startedAt,
|
|
12945
|
+
...result.ok ? {} : { errorClass: errorClass(result) },
|
|
11231
12946
|
// The directory profile records which tool ran, never what was asked.
|
|
11232
12947
|
...directory ? {} : {
|
|
11233
12948
|
args: recordedArgumentValues(curated?.recordedArguments, args),
|
|
@@ -11267,24 +12982,50 @@ function createSpecgenServer(ctx, version = "0.1.0", opts = {}) {
|
|
|
11267
12982
|
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.";
|
|
11268
12983
|
var DETAIL_HINTS = [
|
|
11269
12984
|
[
|
|
11270
|
-
/no longer any instances available|not enough free GPUs/i,
|
|
11271
|
-
"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."
|
|
12985
|
+
/no longer any instances available|no instances currently available|not enough free GPUs/i,
|
|
12986
|
+
"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.",
|
|
12987
|
+
"capacity"
|
|
11272
12988
|
],
|
|
11273
12989
|
[
|
|
11274
12990
|
/at least \$\d|insufficient (?:funds|balance)|\bbalance\b/i,
|
|
11275
|
-
"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."
|
|
12991
|
+
"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.",
|
|
12992
|
+
"balance"
|
|
11276
12993
|
],
|
|
11277
12994
|
[
|
|
11278
12995
|
/mutually exclusive|cannot be combined with/i,
|
|
11279
|
-
"Two arguments conflict: send only one of them and leave the other out entirely. Do not change anything else."
|
|
12996
|
+
"Two arguments conflict: send only one of them and leave the other out entirely. Do not change anything else.",
|
|
12997
|
+
"conflicting_args"
|
|
12998
|
+
],
|
|
12999
|
+
// A 400 with a bare "Unauthorized" detail from a write the same key can
|
|
13000
|
+
// otherwise make is upstream's answer for an unfunded account.
|
|
13001
|
+
[
|
|
13002
|
+
/^\s*unauthorized\s*$/i,
|
|
13003
|
+
"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.",
|
|
13004
|
+
"balance"
|
|
11280
13005
|
]
|
|
11281
13006
|
];
|
|
13007
|
+
function errorClass(result) {
|
|
13008
|
+
const { status } = result;
|
|
13009
|
+
const payload = asRecord(result.payload) ?? { error: result.payload };
|
|
13010
|
+
const detail = detailText(payload);
|
|
13011
|
+
if (status === 400 && detail) {
|
|
13012
|
+
for (const [pattern, , cls] of DETAIL_HINTS)
|
|
13013
|
+
if (pattern.test(detail)) return cls;
|
|
13014
|
+
}
|
|
13015
|
+
if (status === 400 || status === 422) return "validation";
|
|
13016
|
+
if (status === 401) return "auth";
|
|
13017
|
+
if (status === 402) return "balance";
|
|
13018
|
+
if (status === 403) return "permission";
|
|
13019
|
+
if (status === 404) return "not_found";
|
|
13020
|
+
if (status === 429) return "rate_limited";
|
|
13021
|
+
if (status === 504) return "timeout";
|
|
13022
|
+
if (status >= 500) return "server";
|
|
13023
|
+
return "other";
|
|
13024
|
+
}
|
|
11282
13025
|
function errorHint(status, detail) {
|
|
11283
13026
|
if (status === 400 && detail) {
|
|
11284
13027
|
for (const [pattern, hint] of DETAIL_HINTS)
|
|
11285
13028
|
if (pattern.test(detail)) return hint;
|
|
11286
|
-
if (/^unauthorized$/i.test(detail.trim()))
|
|
11287
|
-
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.";
|
|
11288
13029
|
}
|
|
11289
13030
|
if (status === 400 || status === 422) return SHAPE_HINT;
|
|
11290
13031
|
if (status === 401) return "The Runpod API key is missing or invalid.";
|