@nodetool-ai/deploy 0.7.0-rc.11

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.
Files changed (133) hide show
  1. package/dist/admin-client.d.ts +58 -0
  2. package/dist/admin-client.d.ts.map +1 -0
  3. package/dist/admin-client.js +275 -0
  4. package/dist/admin-client.js.map +1 -0
  5. package/dist/admin-operations.d.ts +197 -0
  6. package/dist/admin-operations.d.ts.map +1 -0
  7. package/dist/admin-operations.js +433 -0
  8. package/dist/admin-operations.js.map +1 -0
  9. package/dist/admin-routes.d.ts +306 -0
  10. package/dist/admin-routes.d.ts.map +1 -0
  11. package/dist/admin-routes.js +383 -0
  12. package/dist/admin-routes.js.map +1 -0
  13. package/dist/api-user-manager.d.ts +72 -0
  14. package/dist/api-user-manager.d.ts.map +1 -0
  15. package/dist/api-user-manager.js +89 -0
  16. package/dist/api-user-manager.js.map +1 -0
  17. package/dist/auth.d.ts +67 -0
  18. package/dist/auth.d.ts.map +1 -0
  19. package/dist/auth.js +142 -0
  20. package/dist/auth.js.map +1 -0
  21. package/dist/collection-routes.d.ts +37 -0
  22. package/dist/collection-routes.d.ts.map +1 -0
  23. package/dist/collection-routes.js +43 -0
  24. package/dist/collection-routes.js.map +1 -0
  25. package/dist/compose.d.ts +52 -0
  26. package/dist/compose.d.ts.map +1 -0
  27. package/dist/compose.js +153 -0
  28. package/dist/compose.js.map +1 -0
  29. package/dist/configure.d.ts +87 -0
  30. package/dist/configure.d.ts.map +1 -0
  31. package/dist/configure.js +104 -0
  32. package/dist/configure.js.map +1 -0
  33. package/dist/deploy-to-gcp.d.ts +67 -0
  34. package/dist/deploy-to-gcp.d.ts.map +1 -0
  35. package/dist/deploy-to-gcp.js +268 -0
  36. package/dist/deploy-to-gcp.js.map +1 -0
  37. package/dist/deploy-to-runpod.d.ts +53 -0
  38. package/dist/deploy-to-runpod.d.ts.map +1 -0
  39. package/dist/deploy-to-runpod.js +207 -0
  40. package/dist/deploy-to-runpod.js.map +1 -0
  41. package/dist/deploy.d.ts +54 -0
  42. package/dist/deploy.d.ts.map +1 -0
  43. package/dist/deploy.js +82 -0
  44. package/dist/deploy.js.map +1 -0
  45. package/dist/deployment-config.d.ts +1073 -0
  46. package/dist/deployment-config.d.ts.map +1 -0
  47. package/dist/deployment-config.js +536 -0
  48. package/dist/deployment-config.js.map +1 -0
  49. package/dist/docker-run.d.ts +85 -0
  50. package/dist/docker-run.d.ts.map +1 -0
  51. package/dist/docker-run.js +202 -0
  52. package/dist/docker-run.js.map +1 -0
  53. package/dist/docker.d.ts +98 -0
  54. package/dist/docker.d.ts.map +1 -0
  55. package/dist/docker.js +396 -0
  56. package/dist/docker.js.map +1 -0
  57. package/dist/fly.d.ts +40 -0
  58. package/dist/fly.d.ts.map +1 -0
  59. package/dist/fly.js +291 -0
  60. package/dist/fly.js.map +1 -0
  61. package/dist/gcp.d.ts +59 -0
  62. package/dist/gcp.d.ts.map +1 -0
  63. package/dist/gcp.js +339 -0
  64. package/dist/gcp.js.map +1 -0
  65. package/dist/google-cloud-run-api.d.ts +134 -0
  66. package/dist/google-cloud-run-api.d.ts.map +1 -0
  67. package/dist/google-cloud-run-api.js +532 -0
  68. package/dist/google-cloud-run-api.js.map +1 -0
  69. package/dist/huggingface.d.ts +69 -0
  70. package/dist/huggingface.d.ts.map +1 -0
  71. package/dist/huggingface.js +346 -0
  72. package/dist/huggingface.js.map +1 -0
  73. package/dist/image-builder.d.ts +35 -0
  74. package/dist/image-builder.d.ts.map +1 -0
  75. package/dist/image-builder.js +157 -0
  76. package/dist/image-builder.js.map +1 -0
  77. package/dist/image-spec.d.ts +41 -0
  78. package/dist/image-spec.d.ts.map +1 -0
  79. package/dist/image-spec.js +49 -0
  80. package/dist/image-spec.js.map +1 -0
  81. package/dist/index.d.ts +33 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +45 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/manager.d.ts +121 -0
  86. package/dist/manager.d.ts.map +1 -0
  87. package/dist/manager.js +225 -0
  88. package/dist/manager.js.map +1 -0
  89. package/dist/progress.d.ts +91 -0
  90. package/dist/progress.d.ts.map +1 -0
  91. package/dist/progress.js +262 -0
  92. package/dist/progress.js.map +1 -0
  93. package/dist/railway.d.ts +65 -0
  94. package/dist/railway.d.ts.map +1 -0
  95. package/dist/railway.js +284 -0
  96. package/dist/railway.js.map +1 -0
  97. package/dist/remote-users.d.ts +74 -0
  98. package/dist/remote-users.d.ts.map +1 -0
  99. package/dist/remote-users.js +172 -0
  100. package/dist/remote-users.js.map +1 -0
  101. package/dist/runpod-api.d.ts +206 -0
  102. package/dist/runpod-api.d.ts.map +1 -0
  103. package/dist/runpod-api.js +703 -0
  104. package/dist/runpod-api.js.map +1 -0
  105. package/dist/runpod.d.ts +82 -0
  106. package/dist/runpod.d.ts.map +1 -0
  107. package/dist/runpod.js +188 -0
  108. package/dist/runpod.js.map +1 -0
  109. package/dist/self-hosted.d.ts +157 -0
  110. package/dist/self-hosted.d.ts.map +1 -0
  111. package/dist/self-hosted.js +799 -0
  112. package/dist/self-hosted.js.map +1 -0
  113. package/dist/ssh.d.ts +166 -0
  114. package/dist/ssh.d.ts.map +1 -0
  115. package/dist/ssh.js +430 -0
  116. package/dist/ssh.js.map +1 -0
  117. package/dist/state.d.ts +83 -0
  118. package/dist/state.d.ts.map +1 -0
  119. package/dist/state.js +368 -0
  120. package/dist/state.js.map +1 -0
  121. package/dist/storage-routes.d.ts +55 -0
  122. package/dist/storage-routes.d.ts.map +1 -0
  123. package/dist/storage-routes.js +160 -0
  124. package/dist/storage-routes.js.map +1 -0
  125. package/dist/sync.d.ts +38 -0
  126. package/dist/sync.d.ts.map +1 -0
  127. package/dist/sync.js +130 -0
  128. package/dist/sync.js.map +1 -0
  129. package/dist/workflow-syncer.d.ts +51 -0
  130. package/dist/workflow-syncer.d.ts.map +1 -0
  131. package/dist/workflow-syncer.js +192 -0
  132. package/dist/workflow-syncer.js.map +1 -0
  133. package/package.json +58 -0
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Google Cloud Run Deployment Script for NodeTool Workflows
3
+ *
4
+ * Automates the deployment of NodeTool services to Google Cloud Run:
5
+ * 1. Builds a Docker container for Cloud Run execution
6
+ * 2. Pushes the image to Google Container Registry or Artifact Registry
7
+ * 3. Deploys the service to Google Cloud Run
8
+ *
9
+ * Ported from nodetool.deploy.deploy_to_gcp (Python).
10
+ */
11
+ import { deployToCloudRun, enableRequiredApis, ensureCloudRunPermissions, ensureGcloudAuth, ensureProjectSet, pushToGcr, deleteCloudRunService, listCloudRunServices } from "./google-cloud-run-api.js";
12
+ import { buildDockerImage, runCommand } from "./docker.js";
13
+ // ---------------------------------------------------------------------------
14
+ // Helpers
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * Sanitize a name for use as Cloud Run service name.
18
+ *
19
+ * Cloud Run service names must:
20
+ * - Start with a letter
21
+ * - Contain only lowercase letters, numbers, and hyphens
22
+ * - Be 63 characters or less
23
+ * - End with a letter or number
24
+ */
25
+ export function sanitizeServiceName(name) {
26
+ // Convert to lowercase and replace invalid chars with hyphens
27
+ let sanitized = name.toLowerCase().replace(/[^a-z0-9-]/g, "-");
28
+ // Remove consecutive hyphens
29
+ sanitized = sanitized.replace(/-+/g, "-");
30
+ // Ensure it starts with a letter
31
+ if (sanitized.length > 0 && !/^[a-z]/.test(sanitized)) {
32
+ sanitized = "svc-" + sanitized;
33
+ }
34
+ // Remove leading/trailing hyphens
35
+ sanitized = sanitized.replace(/^-+|-+$/g, "");
36
+ // Ensure it ends with alphanumeric
37
+ if (sanitized.length > 0 && !/[a-z0-9]$/.test(sanitized)) {
38
+ sanitized = sanitized.replace(/-+$/, "");
39
+ }
40
+ // Truncate to 63 characters
41
+ if (sanitized.length > 63) {
42
+ sanitized = sanitized.slice(0, 60) + "svc";
43
+ }
44
+ // Ensure it's not empty
45
+ if (!sanitized) {
46
+ sanitized = "nodetool-svc";
47
+ }
48
+ return sanitized;
49
+ }
50
+ /**
51
+ * Infer Artifact Registry URL from region.
52
+ */
53
+ export function inferRegistryFromRegion(region) {
54
+ return `${region}-docker.pkg.dev`;
55
+ }
56
+ /**
57
+ * Get the default environment variables for a GCP deployment.
58
+ */
59
+ export function getGcpDefaultEnv(deployment) {
60
+ const env = {};
61
+ const gcsBucket = deployment.storage?.gcs_bucket ?? null;
62
+ const gcsMountPath = deployment.storage?.gcs_mount_path ?? "/mnt/gcs";
63
+ env["NODETOOL_SERVER_MODE"] = "private";
64
+ env["HF_HOME"] = gcsBucket
65
+ ? `${gcsMountPath}/.cache/huggingface`
66
+ : "/workspace/.cache/huggingface";
67
+ env["HF_HUB_CACHE"] = gcsBucket
68
+ ? `${gcsMountPath}/.cache/huggingface/hub`
69
+ : "/workspace/.cache/huggingface/hub";
70
+ env["TRANSFORMERS_CACHE"] = gcsBucket
71
+ ? `${gcsMountPath}/.cache/transformers`
72
+ : "/workspace/.cache/transformers";
73
+ env["OLLAMA_MODELS"] = gcsBucket
74
+ ? `${gcsMountPath}/.ollama/models`
75
+ : "/workspace/.ollama/models";
76
+ const persistentPaths = deployment.persistent_paths;
77
+ if (persistentPaths) {
78
+ env["USERS_FILE"] = persistentPaths.users_file;
79
+ env["DB_PATH"] = persistentPaths.db_path;
80
+ env["CHROMA_PATH"] = persistentPaths.chroma_path;
81
+ env["ASSET_BUCKET"] = persistentPaths.asset_bucket;
82
+ env["AUTH_PROVIDER"] = "multi_user";
83
+ }
84
+ else {
85
+ env["AUTH_PROVIDER"] = "static";
86
+ }
87
+ return env;
88
+ }
89
+ /**
90
+ * Deploy nodetool service to Google Cloud Run infrastructure.
91
+ *
92
+ * This is the main deployment function that orchestrates the entire process.
93
+ */
94
+ export async function deployToGcp(options) {
95
+ const { deployment, env: envInput, skipBuild = false, skipPush = false, skipDeploy = false, noCache = false, skipPermissionSetup = false } = options;
96
+ const env = envInput ? { ...envInput } : {};
97
+ let serviceName = deployment.service_name;
98
+ let projectId = deployment.project_id;
99
+ const region = deployment.region;
100
+ let registry = deployment.image.registry;
101
+ const cpu = deployment.resources.cpu;
102
+ const memory = deployment.resources.memory;
103
+ const gpuType = deployment.resources.gpu_type ?? null;
104
+ const gpuCount = deployment.resources.gpu_count ?? (gpuType ? 1 : 0);
105
+ const minInstances = deployment.resources.min_instances;
106
+ const maxInstances = deployment.resources.max_instances;
107
+ const concurrency = deployment.resources.concurrency;
108
+ const timeout = deployment.resources.timeout;
109
+ const allowUnauthenticated = deployment.iam.allow_unauthenticated;
110
+ let imageName = deployment.image.repository;
111
+ const tag = deployment.image.tag;
112
+ const platform = deployment.image.build.platform;
113
+ const serviceAccount = deployment.iam.service_account ?? null;
114
+ const gcsBucket = deployment.storage?.gcs_bucket ?? null;
115
+ const gcsMountPath = deployment.storage?.gcs_mount_path ?? "/mnt/gcs";
116
+ // Sanitize service name for Cloud Run
117
+ serviceName = sanitizeServiceName(serviceName);
118
+ console.log(`Using service name: ${serviceName}`);
119
+ // Ensure Google Cloud authentication and configuration
120
+ await ensureGcloudAuth();
121
+ projectId = await ensureProjectSet(projectId);
122
+ console.log(`Using project: ${projectId}`);
123
+ // Enable required APIs
124
+ await enableRequiredApis(projectId);
125
+ // Ensure Cloud Run permissions (unless skipped)
126
+ if (!skipPermissionSetup) {
127
+ await ensureCloudRunPermissions(projectId, serviceAccount);
128
+ }
129
+ else {
130
+ console.warn("Skipping automatic permission setup");
131
+ }
132
+ // Infer registry from region if not provided
133
+ if (!registry) {
134
+ registry = inferRegistryFromRegion(region);
135
+ console.log(`Inferred registry from region: ${registry}`);
136
+ }
137
+ else {
138
+ console.log(`Using provided registry: ${registry}`);
139
+ }
140
+ const imageTag = tag;
141
+ console.log(`Using provided tag: ${imageTag}`);
142
+ // Use service name as image name if not provided
143
+ if (!imageName) {
144
+ imageName = serviceName;
145
+ }
146
+ const localImageName = `${registry}/${projectId}/${imageName}`;
147
+ // Check if Docker is running
148
+ if (!skipBuild) {
149
+ try {
150
+ runCommand("docker --version", true);
151
+ }
152
+ catch {
153
+ throw new Error("Docker is not installed or not running");
154
+ }
155
+ }
156
+ console.log(`Local image name: ${localImageName}`);
157
+ let deploymentInfo = null;
158
+ try {
159
+ // Build Docker image
160
+ if (!skipBuild) {
161
+ buildDockerImage({
162
+ imageName: localImageName,
163
+ tag: imageTag,
164
+ platform,
165
+ useCache: !noCache,
166
+ autoPush: false // Always disable auto_push for GCP to keep image local
167
+ });
168
+ }
169
+ // Push to Google Container Registry
170
+ let gcpImageUrl = null;
171
+ if (!skipPush) {
172
+ gcpImageUrl = await pushToGcr(localImageName, imageTag, projectId, registry);
173
+ console.log(`Image pushed to registry: ${gcpImageUrl}`);
174
+ }
175
+ // Set default cache envs (respect provided values)
176
+ const defaultEnv = getGcpDefaultEnv(deployment);
177
+ for (const [key, value] of Object.entries(defaultEnv)) {
178
+ if (!(key in env)) {
179
+ env[key] = value;
180
+ }
181
+ }
182
+ // Deploy to Cloud Run
183
+ if (!skipDeploy && gcpImageUrl) {
184
+ console.log("Deploying to Cloud Run...");
185
+ deploymentInfo = await deployToCloudRun({
186
+ serviceName,
187
+ imageUrl: gcpImageUrl,
188
+ region,
189
+ projectId,
190
+ port: 8000,
191
+ cpu,
192
+ memory,
193
+ gpuType,
194
+ gpuCount,
195
+ minInstances,
196
+ maxInstances,
197
+ concurrency,
198
+ timeout,
199
+ allowUnauthenticated,
200
+ envVars: env,
201
+ serviceAccount,
202
+ gcsBucket,
203
+ gcsMountPath
204
+ });
205
+ }
206
+ // Print deployment summary
207
+ printGcpDeploymentSummary({
208
+ imageName: localImageName,
209
+ imageTag,
210
+ gcpImageUrl,
211
+ serviceName,
212
+ region,
213
+ projectId,
214
+ deploymentInfo
215
+ });
216
+ }
217
+ catch (e) {
218
+ const msg = e instanceof Error ? e.message : String(e);
219
+ console.error(`Deployment failed: ${msg}`);
220
+ if (e instanceof Error && e.stack) {
221
+ console.error(e.stack);
222
+ }
223
+ throw new Error(`GCP deployment failed: ${msg}`);
224
+ }
225
+ }
226
+ /**
227
+ * Print a summary of the Google Cloud Run deployment results.
228
+ */
229
+ export function printGcpDeploymentSummary(opts) {
230
+ console.log("\nGoogle Cloud Run Deployment completed successfully!");
231
+ console.log(`Local Image: ${opts.imageName}:${opts.imageTag}`);
232
+ if (opts.gcpImageUrl) {
233
+ console.log(`GCP Image: ${opts.gcpImageUrl}`);
234
+ }
235
+ console.log(`Project: ${opts.projectId}`);
236
+ console.log(`Region: ${opts.region}`);
237
+ console.log(`Service: ${opts.serviceName}`);
238
+ if (opts.deploymentInfo) {
239
+ const status = opts.deploymentInfo["status"];
240
+ const serviceUrl = status?.["url"];
241
+ if (serviceUrl) {
242
+ console.log(`Service URL: ${serviceUrl}`);
243
+ console.log(`Console: https://console.cloud.google.com/run/detail/${opts.region}/${opts.serviceName}/metrics?project=${opts.projectId}`);
244
+ }
245
+ }
246
+ console.log("\nDeployment ready for use!");
247
+ }
248
+ // ---------------------------------------------------------------------------
249
+ // Service management helpers
250
+ // ---------------------------------------------------------------------------
251
+ /**
252
+ * Delete a Google Cloud Run service.
253
+ */
254
+ export async function deleteGcpService(serviceName, region = "us-central1", projectId) {
255
+ await ensureGcloudAuth();
256
+ const resolvedProjectId = await ensureProjectSet(projectId);
257
+ const sanitizedName = sanitizeServiceName(serviceName);
258
+ return deleteCloudRunService(sanitizedName, region, resolvedProjectId);
259
+ }
260
+ /**
261
+ * List Google Cloud Run services.
262
+ */
263
+ export async function listGcpServices(region = "us-central1", projectId) {
264
+ await ensureGcloudAuth();
265
+ const resolvedProjectId = await ensureProjectSet(projectId);
266
+ return listCloudRunServices(region, resolvedProjectId);
267
+ }
268
+ //# sourceMappingURL=deploy-to-gcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-to-gcp.js","sourceRoot":"","sources":["../src/deploy-to-gcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * RunPod Deployment Script for NodeTool Workflows
3
+ *
4
+ * Automates deployment of NodeTool services to RunPod serverless infrastructure:
5
+ * 1. Builds a Docker container for RunPod execution
6
+ * 2. Optionally creates RunPod templates and endpoints using the RunPod SDK
7
+ *
8
+ * Requirements:
9
+ * - Docker installed and running
10
+ * - RunPod API key (for deployment operations)
11
+ * - Docker registry authentication (docker login)
12
+ */
13
+ import type { RunPodDeployment } from "./deployment-config.js";
14
+ /**
15
+ * Sanitize a name for use as Docker image name or RunPod template name.
16
+ *
17
+ * Converts to lowercase, replaces spaces and special characters with hyphens,
18
+ * removes consecutive hyphens, and removes leading/trailing hyphens.
19
+ */
20
+ export declare function sanitizeName(name: string): string;
21
+ export interface DeployToRunpodOptions {
22
+ deployment: RunPodDeployment;
23
+ dockerUsername?: string;
24
+ dockerRegistry?: string;
25
+ imageName?: string;
26
+ tag?: string;
27
+ templateName?: string;
28
+ platform?: string;
29
+ gpuTypes?: string[];
30
+ gpuCount?: number;
31
+ dataCenters?: string[];
32
+ workersMin?: number;
33
+ workersMax?: number;
34
+ idleTimeout?: number;
35
+ executionTimeout?: number;
36
+ flashboot?: boolean;
37
+ skipBuild?: boolean;
38
+ skipPush?: boolean;
39
+ skipTemplate?: boolean;
40
+ skipEndpoint?: boolean;
41
+ noCache?: boolean;
42
+ noAutoPush?: boolean;
43
+ name?: string;
44
+ env?: Record<string, string>;
45
+ }
46
+ /**
47
+ * Deploy workflow or chat handler to RunPod serverless infrastructure.
48
+ *
49
+ * This is the main deployment function that orchestrates the entire deployment
50
+ * process: build, push, template creation, and endpoint creation.
51
+ */
52
+ export declare function deployToRunpod(opts: DeployToRunpodOptions): Promise<void>;
53
+ //# sourceMappingURL=deploy-to-runpod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-to-runpod.d.ts","sourceRoot":"","sources":["../src/deploy-to-runpod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAiB/D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AA6DD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA8Kf"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * RunPod Deployment Script for NodeTool Workflows
3
+ *
4
+ * Automates deployment of NodeTool services to RunPod serverless infrastructure:
5
+ * 1. Builds a Docker container for RunPod execution
6
+ * 2. Optionally creates RunPod templates and endpoints using the RunPod SDK
7
+ *
8
+ * Requirements:
9
+ * - Docker installed and running
10
+ * - RunPod API key (for deployment operations)
11
+ * - Docker registry authentication (docker login)
12
+ */
13
+ import { buildDockerImage, formatImageName, generateImageTag, pushToRegistry, runCommand } from "./docker.js";
14
+ import { createOrUpdateRunpodTemplate, createRunpodEndpointGraphql } from "./runpod-api.js";
15
+ // ---------------------------------------------------------------------------
16
+ // Helpers
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Sanitize a name for use as Docker image name or RunPod template name.
20
+ *
21
+ * Converts to lowercase, replaces spaces and special characters with hyphens,
22
+ * removes consecutive hyphens, and removes leading/trailing hyphens.
23
+ */
24
+ export function sanitizeName(name) {
25
+ let sanitized = name.toLowerCase().replace(/[^a-zA-Z0-9-]/g, "-");
26
+ sanitized = sanitized.replace(/-+/g, "-");
27
+ sanitized = sanitized.replace(/^-+|-+$/g, "");
28
+ return sanitized || "workflow";
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // Docker username resolution
32
+ // ---------------------------------------------------------------------------
33
+ /**
34
+ * Resolve Docker username from explicit argument, env, or config.
35
+ * Matches Python's `get_docker_username`.
36
+ */
37
+ function getDockerUsername(dockerUsername, _dockerRegistry, skipBuild, skipPush) {
38
+ const username = dockerUsername ?? process.env.DOCKER_USERNAME ?? undefined;
39
+ if (!username && !(skipBuild && skipPush)) {
40
+ console.error("Error: Docker username is required for building and pushing images.");
41
+ console.error("Provide it via one of these methods:");
42
+ console.error("1. Pass dockerUsername option");
43
+ console.error("2. Environment variable: export DOCKER_USERNAME=myusername");
44
+ console.error("3. Docker login: docker login (will be read from ~/.docker/config.json)");
45
+ throw new Error("Docker username is required");
46
+ }
47
+ if (username) {
48
+ console.log(`Using Docker username: ${username}`);
49
+ }
50
+ return username;
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // Deployment summary
54
+ // ---------------------------------------------------------------------------
55
+ function printDeploymentSummary(fullImageName, imageTag, platform, templateId, endpointId, deploymentPlatform = "RunPod") {
56
+ console.log(`\n${deploymentPlatform} Deployment completed successfully!`);
57
+ console.log(`Image: ${fullImageName}:${imageTag}`);
58
+ console.log(`Platform: ${platform}`);
59
+ if (templateId)
60
+ console.log(`Template ID: ${templateId}`);
61
+ if (endpointId)
62
+ console.log(`Endpoint ID: ${endpointId}`);
63
+ }
64
+ /**
65
+ * Deploy workflow or chat handler to RunPod serverless infrastructure.
66
+ *
67
+ * This is the main deployment function that orchestrates the entire deployment
68
+ * process: build, push, template creation, and endpoint creation.
69
+ */
70
+ export async function deployToRunpod(opts) {
71
+ const { deployment } = opts;
72
+ const env = { ...(opts.env ?? {}) };
73
+ let dockerUsername = opts.dockerUsername ?? deployment.docker.username ?? undefined;
74
+ const dockerRegistry = opts.dockerRegistry ?? deployment.docker.registry ?? "docker.io";
75
+ const imageName = opts.imageName ?? deployment.image.name;
76
+ const platform = opts.platform ?? deployment.platform ?? "linux/amd64";
77
+ let templateName = opts.templateName ?? opts.name ?? deployment.template_name ?? undefined;
78
+ const computeType = deployment.compute_type ?? "GPU";
79
+ const gpuTypes = opts.gpuTypes ?? deployment.gpu_types ?? [];
80
+ const gpuCount = opts.gpuCount ?? deployment.gpu_count ?? undefined;
81
+ const dataCenters = opts.dataCenters ?? deployment.data_centers ?? [];
82
+ const workersMin = opts.workersMin ?? deployment.workers_min ?? 0;
83
+ const workersMax = opts.workersMax ?? deployment.workers_max ?? 3;
84
+ const idleTimeout = opts.idleTimeout ?? deployment.idle_timeout ?? 5;
85
+ const executionTimeout = opts.executionTimeout ?? deployment.execution_timeout ?? undefined;
86
+ const flashboot = opts.flashboot ?? deployment.flashboot ?? false;
87
+ const networkVolumeId = deployment.network_volume_id ?? undefined;
88
+ const skipBuild = opts.skipBuild ?? false;
89
+ const skipPush = opts.skipPush ?? false;
90
+ const skipTemplate = opts.skipTemplate ?? false;
91
+ const skipEndpoint = opts.skipEndpoint ?? false;
92
+ const noCache = opts.noCache ?? false;
93
+ const noAutoPush = opts.noAutoPush ?? false;
94
+ // Get Docker username
95
+ dockerUsername = getDockerUsername(dockerUsername, dockerRegistry, skipBuild, skipPush);
96
+ // Generate unique tag if not provided
97
+ let imageTag;
98
+ if (opts.tag ?? deployment.image.tag) {
99
+ imageTag = opts.tag ?? deployment.image.tag;
100
+ console.log(`Using provided tag: ${imageTag}`);
101
+ }
102
+ else {
103
+ imageTag = generateImageTag();
104
+ console.log(`Generated unique tag: ${imageTag}`);
105
+ }
106
+ // Check if Docker is running
107
+ if (!skipBuild) {
108
+ try {
109
+ runCommand("docker --version", true);
110
+ }
111
+ catch {
112
+ console.error("Error: Docker is not installed or not running");
113
+ throw new Error("Docker is not available");
114
+ }
115
+ }
116
+ // Format full image name with registry and username
117
+ if (!imageName) {
118
+ throw new Error("Image name is required");
119
+ }
120
+ if (!dockerUsername) {
121
+ throw new Error("Docker username is required");
122
+ }
123
+ const fullImageName = formatImageName(imageName, dockerUsername, dockerRegistry);
124
+ console.log(`Full image name: ${fullImageName}`);
125
+ templateName = templateName ?? imageName;
126
+ console.log(`Using template name: ${templateName}`);
127
+ let templateId;
128
+ let endpointId;
129
+ try {
130
+ // Build Docker image
131
+ let imagePushedDuringBuild = false;
132
+ if (!skipBuild) {
133
+ imagePushedDuringBuild = buildDockerImage({
134
+ imageName: fullImageName,
135
+ tag: imageTag,
136
+ platform,
137
+ useCache: !noCache,
138
+ autoPush: !noAutoPush
139
+ });
140
+ }
141
+ // Push to registry if needed
142
+ if (!skipPush && !imagePushedDuringBuild) {
143
+ pushToRegistry(fullImageName, imageTag, dockerRegistry);
144
+ }
145
+ else if (imagePushedDuringBuild) {
146
+ console.log(`Image ${fullImageName}:${imageTag} already pushed during optimized build`);
147
+ }
148
+ // Create or update RunPod template
149
+ if (!skipTemplate) {
150
+ env.PORT = "8000";
151
+ env.PORT_HEALTH = "8000";
152
+ if (!env.NODETOOL_SERVER_MODE) {
153
+ env.NODETOOL_SERVER_MODE = "private";
154
+ }
155
+ // Configure paths from persistent_paths if available
156
+ const persistentPaths = deployment.persistent_paths;
157
+ if (persistentPaths) {
158
+ if (!env.USERS_FILE)
159
+ env.USERS_FILE = persistentPaths.users_file;
160
+ if (!env.DB_PATH)
161
+ env.DB_PATH = persistentPaths.db_path;
162
+ if (!env.CHROMA_PATH)
163
+ env.CHROMA_PATH = persistentPaths.chroma_path;
164
+ if (!env.HF_HOME)
165
+ env.HF_HOME = persistentPaths.hf_cache;
166
+ if (!env.ASSET_BUCKET)
167
+ env.ASSET_BUCKET = persistentPaths.asset_bucket;
168
+ if (!env.AUTH_PROVIDER)
169
+ env.AUTH_PROVIDER = "multi_user";
170
+ }
171
+ else {
172
+ if (!env.AUTH_PROVIDER)
173
+ env.AUTH_PROVIDER = "static";
174
+ }
175
+ templateId = await createOrUpdateRunpodTemplate(templateName, fullImageName, imageTag, env);
176
+ }
177
+ // Create RunPod endpoint
178
+ if (!skipEndpoint && templateId) {
179
+ const gpuTypeIds = gpuTypes.length > 0 ? gpuTypes : undefined;
180
+ const dataCenterIds = dataCenters.length > 0 ? dataCenters : undefined;
181
+ if (!opts.name) {
182
+ throw new Error("Name is required for endpoint creation");
183
+ }
184
+ endpointId = await createRunpodEndpointGraphql({
185
+ templateId,
186
+ name: opts.name,
187
+ computeType,
188
+ gpuTypeIds,
189
+ gpuCount,
190
+ dataCenterIds,
191
+ workersMin,
192
+ workersMax,
193
+ idleTimeout,
194
+ executionTimeoutMs: executionTimeout,
195
+ flashboot,
196
+ networkVolumeId
197
+ });
198
+ }
199
+ // Print deployment summary
200
+ printDeploymentSummary(fullImageName, imageTag, platform, templateId, endpointId, "RunPod");
201
+ }
202
+ catch (err) {
203
+ console.error("Deployment failed:", err);
204
+ throw err;
205
+ }
206
+ }
207
+ //# sourceMappingURL=deploy-to-runpod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-to-runpod.js","sourceRoot":"","sources":["../src/deploy-to-runpod.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Generic Deployment Module
3
+ *
4
+ * This module provides generic deployment functionality that can be shared
5
+ * across different deployment targets (RunPod, local, etc.).
6
+ *
7
+ * Key Features:
8
+ * - Docker image management
9
+ * - Environment variable handling
10
+ * - Local testing capabilities
11
+ * - Common deployment utilities
12
+ */
13
+ /** Function that runs a shell command (provided by the caller). */
14
+ export type RunCommandFn = (command: string) => void;
15
+ /**
16
+ * Run a Docker container locally instead of deploying to a remote platform.
17
+ *
18
+ * @param fullImageName - Full Docker image name with registry/username
19
+ * @param imageTag - Docker image tag
20
+ * @param runCommand - Function to execute shell commands
21
+ */
22
+ export declare function runLocalDocker(fullImageName: string, imageTag: string, runCommand: RunCommandFn): void;
23
+ /** Function to retrieve Docker username from config file. */
24
+ export type GetDockerUsernameFromConfigFn = (registry: string) => string | null;
25
+ /**
26
+ * Get Docker username from multiple sources with validation.
27
+ *
28
+ * @param opts.dockerUsername - Explicit username from command line
29
+ * @param opts.dockerRegistry - Docker registry URL (default: "docker.io")
30
+ * @param opts.skipBuild - Whether build is being skipped
31
+ * @param opts.skipPush - Whether push is being skipped
32
+ * @param opts.getDockerUsernameFromConfig - Function to read username from Docker config
33
+ * @returns Docker username or null if not needed
34
+ * @throws Error if username is required but not found
35
+ */
36
+ export declare function getDockerUsername(opts: {
37
+ dockerUsername?: string;
38
+ dockerRegistry?: string;
39
+ skipBuild?: boolean;
40
+ skipPush?: boolean;
41
+ getDockerUsernameFromConfig: GetDockerUsernameFromConfigFn;
42
+ }): string | null;
43
+ /**
44
+ * Print a summary of the deployment results.
45
+ */
46
+ export declare function printDeploymentSummary(opts: {
47
+ fullImageName: string;
48
+ imageTag: string;
49
+ platform: string;
50
+ templateId?: string;
51
+ endpointId?: string;
52
+ deploymentPlatform?: string;
53
+ }): void;
54
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,mEAAmE;AACnE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,YAAY,GACvB,IAAI,CAqBN;AAED,6DAA6D;AAC7D,MAAM,MAAM,6BAA6B,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;AAEhF;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2BAA2B,EAAE,6BAA6B,CAAC;CAC5D,GAAG,MAAM,GAAG,IAAI,CA8BhB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,IAAI,CAqBP"}