buildfunctions 0.0.3 → 0.0.5
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/README.md +87 -1
- package/dist/client.d.ts +34 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +198 -0
- package/dist/client.js.map +1 -0
- package/dist/function/cpu-function.d.ts +19 -0
- package/dist/function/cpu-function.d.ts.map +1 -0
- package/dist/function/cpu-function.js +103 -0
- package/dist/function/cpu-function.js.map +1 -0
- package/dist/function/gpu-function.d.ts +13 -0
- package/dist/function/gpu-function.d.ts.map +1 -0
- package/dist/function/gpu-function.js +202 -0
- package/dist/function/gpu-function.js.map +1 -0
- package/dist/function/index.d.ts +8 -0
- package/dist/function/index.d.ts.map +1 -0
- package/dist/function/index.js +6 -0
- package/dist/function/index.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/sandbox/cpu-sandbox.d.ts +18 -0
- package/dist/sandbox/cpu-sandbox.d.ts.map +1 -0
- package/dist/sandbox/cpu-sandbox.js +293 -0
- package/dist/sandbox/cpu-sandbox.js.map +1 -0
- package/dist/sandbox/gpu-sandbox.d.ts +15 -0
- package/dist/sandbox/gpu-sandbox.d.ts.map +1 -0
- package/dist/sandbox/gpu-sandbox.js +359 -0
- package/dist/sandbox/gpu-sandbox.js.map +1 -0
- package/dist/sandbox/index.d.ts +6 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +6 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/types/index.d.ts +153 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +79 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/framework.d.ts +6 -0
- package/dist/utils/framework.d.ts.map +1 -0
- package/dist/utils/framework.js +17 -0
- package/dist/utils/framework.js.map +1 -0
- package/dist/utils/http.d.ts +24 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +75 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/memory.d.ts +6 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +21 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/uploader.d.ts +41 -0
- package/dist/utils/uploader.d.ts.map +1 -0
- package/dist/utils/uploader.js +157 -0
- package/dist/utils/uploader.js.map +1 -0
- package/package.json +27 -17
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -18
- package/dist/cli.js.map +0 -1
- package/dist/test.d.ts +0 -10
- package/dist/test.d.ts.map +0 -1
- package/dist/test.js +0 -7
- package/dist/test.js.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buildfunctions SDK Error Classes
|
|
3
|
+
*/
|
|
4
|
+
export class BuildfunctionsError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
statusCode;
|
|
7
|
+
details;
|
|
8
|
+
constructor(message, code = 'UNKNOWN_ERROR', statusCode, details) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'BuildfunctionsError';
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.statusCode = statusCode;
|
|
13
|
+
this.details = details;
|
|
14
|
+
Object.setPrototypeOf(this, BuildfunctionsError.prototype);
|
|
15
|
+
}
|
|
16
|
+
static fromResponse(statusCode, body) {
|
|
17
|
+
const message = body.error ?? 'An unknown error occurred';
|
|
18
|
+
const code = mapErrorCode(body.code, statusCode);
|
|
19
|
+
return new BuildfunctionsError(message, code, statusCode);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class AuthenticationError extends BuildfunctionsError {
|
|
23
|
+
constructor(message = 'Invalid or missing API key') {
|
|
24
|
+
super(message, 'UNAUTHORIZED', 401);
|
|
25
|
+
this.name = 'AuthenticationError';
|
|
26
|
+
Object.setPrototypeOf(this, AuthenticationError.prototype);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class NotFoundError extends BuildfunctionsError {
|
|
30
|
+
constructor(resource = 'Resource') {
|
|
31
|
+
super(`${resource} not found`, 'NOT_FOUND', 404);
|
|
32
|
+
this.name = 'NotFoundError';
|
|
33
|
+
Object.setPrototypeOf(this, NotFoundError.prototype);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class ValidationError extends BuildfunctionsError {
|
|
37
|
+
constructor(message, details) {
|
|
38
|
+
super(message, 'VALIDATION_ERROR', 400, details);
|
|
39
|
+
this.name = 'ValidationError';
|
|
40
|
+
Object.setPrototypeOf(this, ValidationError.prototype);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class CapacityError extends BuildfunctionsError {
|
|
44
|
+
constructor(message = 'Service at maximum capacity. Please try again later.') {
|
|
45
|
+
super(message, 'MAX_CAPACITY', 503);
|
|
46
|
+
this.name = 'CapacityError';
|
|
47
|
+
Object.setPrototypeOf(this, CapacityError.prototype);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function mapErrorCode(code, statusCode) {
|
|
51
|
+
if (code) {
|
|
52
|
+
const validCodes = [
|
|
53
|
+
'UNAUTHORIZED',
|
|
54
|
+
'NOT_FOUND',
|
|
55
|
+
'INVALID_REQUEST',
|
|
56
|
+
'MAX_CAPACITY',
|
|
57
|
+
'SIZE_LIMIT_EXCEEDED',
|
|
58
|
+
'VALIDATION_ERROR',
|
|
59
|
+
];
|
|
60
|
+
if (validCodes.includes(code)) {
|
|
61
|
+
return code;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
switch (statusCode) {
|
|
65
|
+
case 401:
|
|
66
|
+
return 'UNAUTHORIZED';
|
|
67
|
+
case 404:
|
|
68
|
+
return 'NOT_FOUND';
|
|
69
|
+
case 400:
|
|
70
|
+
return 'INVALID_REQUEST';
|
|
71
|
+
case 503:
|
|
72
|
+
return 'MAX_CAPACITY';
|
|
73
|
+
case 409:
|
|
74
|
+
return 'SIZE_LIMIT_EXCEEDED';
|
|
75
|
+
default:
|
|
76
|
+
return 'UNKNOWN_ERROR';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/utils/framework.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAcvF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect framework from requirements string
|
|
3
|
+
* Parses requirements.txt style content to find torch/pytorch
|
|
4
|
+
*/
|
|
5
|
+
export function detectFramework(requirements) {
|
|
6
|
+
if (!requirements) {
|
|
7
|
+
return 'pytorch'; // default (todo: remove from being the default)
|
|
8
|
+
}
|
|
9
|
+
const lower = requirements.toLowerCase();
|
|
10
|
+
// Look for torch or pytorch in requirements
|
|
11
|
+
// Common patterns: "torch", "torch==2.0", "pytorch", "torch>=1.0"
|
|
12
|
+
if (lower.includes('torch')) {
|
|
13
|
+
return 'pytorch';
|
|
14
|
+
}
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=framework.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.js","sourceRoot":"","sources":["../../src/utils/framework.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,YAAgC;IAC9D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC,CAAC,sDAAsD;IAC1E,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAEzC,4CAA4C;IAC5C,kEAAkE;IAClE,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for Buildfunctions API
|
|
3
|
+
*/
|
|
4
|
+
export interface HttpClientConfig {
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
apiKey: string;
|
|
7
|
+
timeout?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RequestOptions {
|
|
10
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
11
|
+
path: string;
|
|
12
|
+
body?: Record<string, unknown>;
|
|
13
|
+
params?: Record<string, string | number>;
|
|
14
|
+
}
|
|
15
|
+
export interface HttpClient {
|
|
16
|
+
request: <T>(options: RequestOptions) => Promise<T>;
|
|
17
|
+
get: <T>(path: string, params?: Record<string, string | number>) => Promise<T>;
|
|
18
|
+
post: <T>(path: string, body?: Record<string, unknown>) => Promise<T>;
|
|
19
|
+
put: <T>(path: string, body?: Record<string, unknown>) => Promise<T>;
|
|
20
|
+
delete: <T>(path: string, body?: Record<string, unknown>) => Promise<T>;
|
|
21
|
+
setToken: (token: string) => void;
|
|
22
|
+
}
|
|
23
|
+
export declare function createHttpClient(config: HttpClientConfig): HttpClient;
|
|
24
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACpD,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/E,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA0FrE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for Buildfunctions API
|
|
3
|
+
*/
|
|
4
|
+
import { BuildfunctionsError, AuthenticationError } from './errors.js';
|
|
5
|
+
export function createHttpClient(config) {
|
|
6
|
+
if (!config.apiKey) {
|
|
7
|
+
throw new AuthenticationError('API key is required');
|
|
8
|
+
}
|
|
9
|
+
const baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
10
|
+
let currentToken = config.apiKey;
|
|
11
|
+
const timeout = config.timeout ?? 600000; // 10 minutes default for long-running builds
|
|
12
|
+
const buildUrl = (path, params) => {
|
|
13
|
+
const url = new URL(path, baseUrl);
|
|
14
|
+
if (params) {
|
|
15
|
+
for (const [key, value] of Object.entries(params)) {
|
|
16
|
+
url.searchParams.set(key, String(value));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return url.toString();
|
|
20
|
+
};
|
|
21
|
+
const parseResponse = async (response) => {
|
|
22
|
+
const contentType = response.headers.get('content-type');
|
|
23
|
+
if (contentType?.includes('application/json')) {
|
|
24
|
+
return response.json();
|
|
25
|
+
}
|
|
26
|
+
const text = await response.text();
|
|
27
|
+
return { message: text };
|
|
28
|
+
};
|
|
29
|
+
const request = async (options) => {
|
|
30
|
+
const url = buildUrl(options.path, options.params);
|
|
31
|
+
const controller = new AbortController();
|
|
32
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
33
|
+
try {
|
|
34
|
+
const response = await fetch(url, {
|
|
35
|
+
method: options.method,
|
|
36
|
+
headers: {
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
Authorization: `Bearer ${currentToken}`,
|
|
39
|
+
},
|
|
40
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
41
|
+
signal: controller.signal,
|
|
42
|
+
});
|
|
43
|
+
clearTimeout(timeoutId);
|
|
44
|
+
const data = await parseResponse(response);
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
throw BuildfunctionsError.fromResponse(response.status, data);
|
|
47
|
+
}
|
|
48
|
+
return data;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
clearTimeout(timeoutId);
|
|
52
|
+
if (error instanceof BuildfunctionsError) {
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
if (error instanceof Error) {
|
|
56
|
+
if (error.name === 'AbortError') {
|
|
57
|
+
throw new BuildfunctionsError('Request timed out', 'NETWORK_ERROR');
|
|
58
|
+
}
|
|
59
|
+
throw new BuildfunctionsError('Unable to connect to server', 'NETWORK_ERROR');
|
|
60
|
+
}
|
|
61
|
+
throw new BuildfunctionsError('Request failed', 'UNKNOWN_ERROR');
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
request,
|
|
66
|
+
get: (path, params) => request({ method: 'GET', path, params }),
|
|
67
|
+
post: (path, body) => request({ method: 'POST', path, body }),
|
|
68
|
+
put: (path, body) => request({ method: 'PUT', path, body }),
|
|
69
|
+
delete: (path, body) => request({ method: 'DELETE', path, body }),
|
|
70
|
+
setToken: (token) => {
|
|
71
|
+
currentToken = token;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAmB3D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse memory string to megabytes
|
|
3
|
+
* Accepts: "2GB", "1024MB", or raw number (treated as MB)
|
|
4
|
+
*/
|
|
5
|
+
export function parseMemory(memory) {
|
|
6
|
+
if (typeof memory === 'number') {
|
|
7
|
+
return memory;
|
|
8
|
+
}
|
|
9
|
+
const str = memory.trim().toUpperCase();
|
|
10
|
+
const match = str.match(/^(\d+)\s*(GB|MB)$/);
|
|
11
|
+
if (!match) {
|
|
12
|
+
throw new Error(`Invalid memory format: "${memory}". Use "2GB" or "1024MB".`);
|
|
13
|
+
}
|
|
14
|
+
const value = parseInt(match[1], 10);
|
|
15
|
+
const unit = match[2];
|
|
16
|
+
if (unit === 'GB') {
|
|
17
|
+
return value * 1024;
|
|
18
|
+
}
|
|
19
|
+
return value; // MB
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/utils/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,2BAA2B,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAEvB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,KAAK;AACrB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File upload utilities for GPU Sandbox
|
|
3
|
+
*/
|
|
4
|
+
export interface FileMetadata {
|
|
5
|
+
name: string;
|
|
6
|
+
size: number;
|
|
7
|
+
type: string;
|
|
8
|
+
webkitRelativePath: string;
|
|
9
|
+
localPath: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PresignedUrlInfo {
|
|
12
|
+
signedUrl: string[];
|
|
13
|
+
uploadId: string | null;
|
|
14
|
+
numberOfParts?: number;
|
|
15
|
+
s3FilePath?: string;
|
|
16
|
+
}
|
|
17
|
+
interface TransferDetailsResponse {
|
|
18
|
+
transferDetails: Array<{
|
|
19
|
+
fileName: string;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}>;
|
|
22
|
+
storageApiUrl: string;
|
|
23
|
+
storageApiPath: string;
|
|
24
|
+
}
|
|
25
|
+
interface PresignedUrlsResponse {
|
|
26
|
+
modelAndFunctionPresignedUrls: {
|
|
27
|
+
modelPresignedUrls: Record<string, PresignedUrlInfo>;
|
|
28
|
+
};
|
|
29
|
+
bucketName: string;
|
|
30
|
+
modelRecord?: {
|
|
31
|
+
modelName: string;
|
|
32
|
+
modelFolderContainingFilesPath: string;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export declare function uploadFile(content: Buffer, presignedUrl: string): Promise<void>;
|
|
36
|
+
export declare function uploadMultipartFile(content: Buffer, signedUrls: string[], uploadId: string, numberOfParts: number, bucketName: string, s3FilePath: string, baseUrl: string): Promise<void>;
|
|
37
|
+
export declare function getFilesInDirectory(dirPath: string): FileMetadata[];
|
|
38
|
+
export declare function uploadModelFiles(files: FileMetadata[], presignedUrls: Record<string, PresignedUrlInfo>, bucketName: string, baseUrl: string): Promise<void>;
|
|
39
|
+
export declare function transferFilesToEFS(files: FileMetadata[], sanitizedModelName: string, baseUrl: string, sessionToken: string): Promise<void>;
|
|
40
|
+
export type { PresignedUrlsResponse, TransferDetailsResponse };
|
|
41
|
+
//# sourceMappingURL=uploader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../../src/utils/uploader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,uBAAuB;IAC/B,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,qBAAqB;IAC7B,6BAA6B,EAAE;QAC7B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;KACtD,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,8BAA8B,EAAE,MAAM,CAAC;KACxC,CAAC;CACH;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYrF;AA4BD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CA6BnE;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,YAAY,EAAE,EACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC/C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,YAAY,EAAE,EACrB,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File upload utilities for GPU Sandbox
|
|
3
|
+
*/
|
|
4
|
+
import { statSync, readdirSync } from 'fs';
|
|
5
|
+
import { readFile } from 'fs/promises';
|
|
6
|
+
import { basename, join, relative } from 'path';
|
|
7
|
+
const CHUNK_SIZE = 9 * 1024 * 1024;
|
|
8
|
+
export async function uploadFile(content, presignedUrl) {
|
|
9
|
+
const response = await fetch(presignedUrl, {
|
|
10
|
+
method: 'PUT',
|
|
11
|
+
body: content,
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/octet-stream',
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`Failed to upload file: ${response.statusText}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function uploadPart(content, presignedUrl, partNumber) {
|
|
21
|
+
const response = await fetch(presignedUrl, {
|
|
22
|
+
method: 'PUT',
|
|
23
|
+
body: content,
|
|
24
|
+
headers: {
|
|
25
|
+
'Content-Type': 'application/octet-stream',
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new Error(`Failed to upload part ${partNumber}: ${response.statusText}`);
|
|
30
|
+
}
|
|
31
|
+
const etag = response.headers.get('ETag');
|
|
32
|
+
if (!etag) {
|
|
33
|
+
throw new Error(`Failed to retrieve ETag for part ${partNumber}`);
|
|
34
|
+
}
|
|
35
|
+
const cleanEtag = etag.replace(/^"|"$/g, '');
|
|
36
|
+
return { PartNumber: partNumber, ETag: cleanEtag };
|
|
37
|
+
}
|
|
38
|
+
export async function uploadMultipartFile(content, signedUrls, uploadId, numberOfParts, bucketName, s3FilePath, baseUrl) {
|
|
39
|
+
const parts = [];
|
|
40
|
+
const maxParallelUploads = 5;
|
|
41
|
+
for (let i = 0; i < numberOfParts; i += maxParallelUploads) {
|
|
42
|
+
const batch = [];
|
|
43
|
+
for (let j = i; j < Math.min(i + maxParallelUploads, numberOfParts); j++) {
|
|
44
|
+
const partNumber = j + 1;
|
|
45
|
+
const start = j * CHUNK_SIZE;
|
|
46
|
+
const end = Math.min(start + CHUNK_SIZE, content.length);
|
|
47
|
+
const chunk = content.slice(start, end);
|
|
48
|
+
const signedUrl = signedUrls[j];
|
|
49
|
+
if (!signedUrl) {
|
|
50
|
+
throw new Error(`Missing upload URL for part ${partNumber}`);
|
|
51
|
+
}
|
|
52
|
+
batch.push(uploadPart(chunk, signedUrl, partNumber).then((part) => {
|
|
53
|
+
parts.push(part);
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
await Promise.all(batch);
|
|
57
|
+
}
|
|
58
|
+
const sortedParts = parts.sort((a, b) => a.PartNumber - b.PartNumber);
|
|
59
|
+
const response = await fetch(`${baseUrl}/api/functions/gpu/transfer-and-mount/complete-multipart-upload`, {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers: {
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify({
|
|
65
|
+
bucketName,
|
|
66
|
+
uploadId,
|
|
67
|
+
parts: sortedParts,
|
|
68
|
+
s3FilePath,
|
|
69
|
+
fileName: s3FilePath.split('/').pop(),
|
|
70
|
+
}),
|
|
71
|
+
});
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
const errorText = await response.text();
|
|
74
|
+
throw new Error(`Failed to complete upload: ${response.statusText} - ${errorText}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function getFilesInDirectory(dirPath) {
|
|
78
|
+
const files = [];
|
|
79
|
+
const rootDirName = basename(dirPath);
|
|
80
|
+
function walkDir(currentPath) {
|
|
81
|
+
const entries = readdirSync(currentPath, { withFileTypes: true });
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const fullPath = join(currentPath, entry.name);
|
|
84
|
+
if (entry.isDirectory()) {
|
|
85
|
+
walkDir(fullPath);
|
|
86
|
+
}
|
|
87
|
+
else if (entry.isFile()) {
|
|
88
|
+
const stats = statSync(fullPath);
|
|
89
|
+
const relativePath = relative(dirPath, fullPath);
|
|
90
|
+
files.push({
|
|
91
|
+
name: entry.name,
|
|
92
|
+
size: stats.size,
|
|
93
|
+
type: 'application/octet-stream',
|
|
94
|
+
webkitRelativePath: `${rootDirName}/${relativePath}`,
|
|
95
|
+
localPath: fullPath,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
walkDir(dirPath);
|
|
101
|
+
return files;
|
|
102
|
+
}
|
|
103
|
+
export async function uploadModelFiles(files, presignedUrls, bucketName, baseUrl) {
|
|
104
|
+
const uploadPromises = [];
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
const urlInfo = presignedUrls[file.webkitRelativePath];
|
|
107
|
+
if (!urlInfo) {
|
|
108
|
+
console.error(`No upload URL found for ${file.webkitRelativePath}`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const content = await readFile(file.localPath);
|
|
112
|
+
const signedUrls = urlInfo.signedUrl;
|
|
113
|
+
if (signedUrls.length > 1 && urlInfo.uploadId) {
|
|
114
|
+
uploadPromises.push(uploadMultipartFile(content, signedUrls, urlInfo.uploadId, urlInfo.numberOfParts || signedUrls.length, bucketName, urlInfo.s3FilePath || '', baseUrl));
|
|
115
|
+
}
|
|
116
|
+
else if (signedUrls.length === 1 && signedUrls[0]) {
|
|
117
|
+
uploadPromises.push(uploadFile(content, signedUrls[0]));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
await Promise.all(uploadPromises);
|
|
121
|
+
}
|
|
122
|
+
export async function transferFilesToEFS(files, sanitizedModelName, baseUrl, sessionToken) {
|
|
123
|
+
const detailsResponse = await fetch(`${baseUrl}/api/sdk/sandbox/gpu/get-transfer-details`, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: {
|
|
126
|
+
'Content-Type': 'application/json',
|
|
127
|
+
'Authorization': `Bearer ${sessionToken}`,
|
|
128
|
+
},
|
|
129
|
+
body: JSON.stringify({
|
|
130
|
+
shouldVerifyContents: false,
|
|
131
|
+
filesToTransfer: files.map(f => f.webkitRelativePath),
|
|
132
|
+
sanitizedModelName,
|
|
133
|
+
fileNamesWithinModelFolder: files.map(f => f.name),
|
|
134
|
+
}),
|
|
135
|
+
});
|
|
136
|
+
if (!detailsResponse.ok) {
|
|
137
|
+
const errorData = await detailsResponse.json();
|
|
138
|
+
throw new Error(errorData.error || 'Failed to prepare file transfer');
|
|
139
|
+
}
|
|
140
|
+
const transferData = await detailsResponse.json();
|
|
141
|
+
const { transferDetails, storageApiUrl, storageApiPath } = transferData;
|
|
142
|
+
const validTransferDetails = transferDetails.filter(d => d.fileName && d.fileName.length > 0);
|
|
143
|
+
for (const fileDetail of validTransferDetails) {
|
|
144
|
+
const transferResponse = await fetch(`${storageApiUrl}${storageApiPath}`, {
|
|
145
|
+
method: 'POST',
|
|
146
|
+
headers: {
|
|
147
|
+
'Content-Type': 'application/json',
|
|
148
|
+
},
|
|
149
|
+
body: JSON.stringify(fileDetail),
|
|
150
|
+
});
|
|
151
|
+
if (!transferResponse.ok) {
|
|
152
|
+
const errorText = await transferResponse.text();
|
|
153
|
+
throw new Error(`Failed to transfer ${fileDetail.fileName}: ${errorText}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=uploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../src/utils/uploader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,43 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "buildfunctions",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "The Buildfunctions SDK
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"description": "The Buildfunctions SDK for Agents: Hardware-isolated CPU and GPU Sandboxes for untrusted AI actions",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/
|
|
7
|
-
"types": "./dist/
|
|
8
|
-
"bin": {
|
|
9
|
-
"buildfunctions": "./dist/cli.js"
|
|
10
|
-
},
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
11
8
|
"exports": {
|
|
12
9
|
".": {
|
|
13
|
-
"types": "./dist/
|
|
14
|
-
"import": "./dist/
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
15
12
|
}
|
|
16
13
|
},
|
|
17
14
|
"files": [
|
|
18
|
-
"dist"
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
19
17
|
],
|
|
20
18
|
"scripts": {
|
|
21
19
|
"build": "tsc",
|
|
22
20
|
"dev": "tsc --watch",
|
|
23
|
-
"
|
|
24
|
-
"prepublishOnly": "npm run build",
|
|
25
|
-
"
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
23
|
+
"typecheck": "tsc --noEmit"
|
|
26
24
|
},
|
|
27
25
|
"repository": {
|
|
28
26
|
"type": "git",
|
|
29
27
|
"url": "git+https://github.com/buildfunctions/sdk.git"
|
|
30
28
|
},
|
|
31
29
|
"keywords": [
|
|
32
|
-
"
|
|
33
|
-
"
|
|
30
|
+
"AIAgents",
|
|
31
|
+
"AIInfrastructure",
|
|
32
|
+
"AIApps",
|
|
33
|
+
"Serverless",
|
|
34
|
+
"GPUs",
|
|
35
|
+
"Sandboxes",
|
|
36
|
+
"DeveloperExperience"
|
|
34
37
|
],
|
|
35
38
|
"author": "Buildfunctions",
|
|
36
39
|
"bugs": {
|
|
37
40
|
"url": "https://github.com/buildfunctions/sdk/issues"
|
|
38
41
|
},
|
|
39
|
-
"homepage": "https://
|
|
42
|
+
"homepage": "https://www.buildfunctions.com",
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=18.0.0"
|
|
45
|
+
},
|
|
40
46
|
"devDependencies": {
|
|
41
|
-
"
|
|
47
|
+
"@types/node": "25.0.10",
|
|
48
|
+
"typescript": "5.9.3"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"dotenv": "17.2.3"
|
|
42
52
|
}
|
|
43
53
|
}
|
package/dist/cli.d.ts
DELETED
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Buildfunctions CLI
|
|
4
|
-
*/
|
|
5
|
-
import test from './test.js';
|
|
6
|
-
// Available commands
|
|
7
|
-
const commands = {
|
|
8
|
-
test,
|
|
9
|
-
};
|
|
10
|
-
// Get command from arguments
|
|
11
|
-
const command = process.argv[2];
|
|
12
|
-
if (command && commands[command]) {
|
|
13
|
-
console.log(commands[command]());
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
console.log('Available commands: test');
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,qBAAqB;AACrB,MAAM,QAAQ,GAAiC;IAC7C,IAAI;CACL,CAAC;AAEF,6BAA6B;AAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;IAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAE,EAAE,CAAC,CAAC;CACnC;KAAM;IACL,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;CACzC"}
|
package/dist/test.d.ts
DELETED
package/dist/test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,aAAK,OAAO,GAAG,MAAM,CAAC;AAEtB;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI,IAAI,OAAO,CAEtC"}
|
package/dist/test.js
DELETED
package/dist/test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI;IAC1B,OAAO,oEAAoE,CAAC;AAC9E,CAAC"}
|