UNPKG

@ibm-cloud/watsonx-ai

Version:
275 lines 12.6 kB
/** * (C) Copyright IBM Corp. 2026. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import fs, { constants } from 'fs'; import { access, writeFile } from 'fs/promises'; import { Readable } from 'stream'; import FormData from 'form-data'; import { validateRequestParams, validateRequiredOneOf } from "../helpers/validators.mjs"; import { ENDPOINTS } from "../config/index.mjs"; /** * Helper function to validate file operation request parameters. * * This function performs two levels of validation: * * 1. Ensures that exactly one of 'projectId' or 'spaceId' is provided (required one-of validation) * 2. Validates that all required parameters are present and all provided parameters are valid * * Use this function before making file API calls to ensure the request parameters meet the API * requirements and prevent invalid requests from being sent. * * @param params - The parameters object to validate (typically the request parameters) * @param requiredParams - Array of required parameter names that must be present in params * @param validParams - Array of all valid parameter names that are allowed in params * @throws {Error} If validation fails - either missing required one-of fields, missing required * params, or invalid params present */ function validateFilesParams(params, requiredParams, validParams) { validateRequiredOneOf(params, ['projectId', 'spaceId'], false); validateRequestParams(params, requiredParams, validParams); } /** * Class for managing files used in batch inference operations. * * Provides methods to upload, retrieve, list, download, and manage files associated with batch * inference jobs. */ export class Files { /** * Creates an instance of Files. * * @param {BatchInference} client - The BatchInference client instance. */ constructor(client) { this.client = client; } /** * Upload a file for batch inference. * * Uploads a JSONL file containing batch requests. The file will be used as input for batch * inference jobs. * * @param {UploadBatchFileParams} params - The parameters to send to the service. * @param {string | ReadableStream | Blob} params.file - JSONL file containing batch requests. * @param {string} [params.projectId] - The project that contains the resource. Either `projectId` * or `spaceId` has to be given. * @param {string} [params.spaceId] - The space that contains the resource. Either `spaceId` or * `projectId` has to be given. * @param {OutgoingHttpHeaders} [params.headers] - Custom request headers * @returns {Promise<Response<UploadedFile>>} A promise that resolves to the response with * uploaded file data */ upload(params) { return __awaiter(this, void 0, void 0, function* () { validateFilesParams(params, ['file'], ['projectId', 'spaceId']); const { file, projectId, spaceId, signal } = params; // Validate file parameter if (typeof file === 'string') { try { yield access(file, constants.R_OK); } catch (_a) { throw new Error(`File path does not exist or is not readable: ${file}`); } } const form = new FormData(); if (typeof file === 'string') { form.append('file', fs.createReadStream(file)); } else if (file instanceof ReadableStream) { const nodeStream = Readable.fromWeb(file); form.append('file', nodeStream); } else { form.append('file', file); } form.append('purpose', 'batch'); const headers = Object.assign(Object.assign({}, form.getHeaders()), params.headers); const parameters = { url: ENDPOINTS.FILES.BASE, headers, signal, body: form, projectId, spaceId, }; return this.client._post(parameters); }); } getDetails(params) { return __awaiter(this, void 0, void 0, function* () { if (params && 'fileId' in params) { validateFilesParams(params, ['fileId'], ['projectId', 'spaceId']); const { fileId, projectId, spaceId } = params; const parameters = { url: ENDPOINTS.FILES.BY_ID, headers: params.headers, signal: params.signal, path: { 'file_id': fileId }, projectId, spaceId, }; return this.client._get(parameters); } validateFilesParams(params, [], ['projectId', 'spaceId', 'after', 'limit', 'purpose', 'order']); const { projectId, spaceId, after, limit, purpose = 'batch', order, signal } = params; const headers = Object.assign({ Accept: 'application/json' }, params.headers); const query = { after, limit, purpose, order }; const parameters = { url: ENDPOINTS.FILES.BASE, headers, signal, query, projectId, spaceId, }; return this.client._get(parameters); }); } /** * Retrieve file content. * * Retrieves the content of a specific file by its ID. * * @param {GetFileContentParams} params - The parameters to send to the service. * @param {string} params.fileId - The ID of the file to retrieve. * @param {string} [params.projectId] - The project that contains the resource. Either `projectId` * or `spaceId` has to be given. * @param {string} [params.spaceId] - The space that contains the resource. Either `spaceId` or * `projectId` has to be given. * @param {OutgoingHttpHeaders} [params.headers] - Custom request headers * @returns {Promise<Response<string>>} A promise that resolves to the response with file content */ getContent(params) { return __awaiter(this, void 0, void 0, function* () { validateFilesParams(params, ['fileId'], ['projectId', 'spaceId']); const { fileId, projectId, spaceId } = params; const parameters = { url: ENDPOINTS.FILES.CONTENT_BY_ID, headers: params.headers, signal: params.signal, path: { 'file_id': fileId }, projectId, spaceId, }; return this.client._get(parameters); }); } /** * Check if a file exists at the specified path. * * @private * @param {string} path - The file path to check. * @returns {Promise<boolean>} A promise that resolves to true if the file exists, false otherwise */ fileExists(path) { return __awaiter(this, void 0, void 0, function* () { try { yield access(path, constants.F_OK); return true; } catch (_a) { return false; } }); } /** * Download file content to local filesystem. * * Downloads the content of a file and saves it to the local filesystem. The file must be in JSONL * format. * * @param {DownloadFileContentParams} params - The parameters to send to the service. * @param {string} params.filename - Name of the file to save. Must end with `.jsonl`. * @param {string} [params.path] - Directory path where the file should be saved. * @param {string} [params.fileId] - The ID of the file to download. * @param {string} [params.projectId] - The project that contains the resource. Either `projectId` * or `spaceId` has to be given. * @param {string} [params.spaceId] - The space that contains the resource. Either `spaceId` or * `projectId` has to be given. * @param {OutgoingHttpHeaders} [params.headers] - Custom request headers * @returns {Promise<string>} A promise that resolves to a success message with the file path * @throws {Error} If the file already exists or if the filename doesn't end with `.jsonl` */ download(params) { return __awaiter(this, void 0, void 0, function* () { validateFilesParams(params, ['filename'], ['projectId', 'spaceId', 'fileId', 'path']); const { filename, path } = params, rest = __rest(params, ["filename", "path"]); if (!filename.endsWith('.jsonl')) throw new Error('Downloaded files must be in jsonl format'); const filenameWithPath = path ? `${path}/${filename}` : filename; const fileExistsError = new Error(`File already exists: ${filenameWithPath}`); if (yield this.fileExists(filenameWithPath)) throw fileExistsError; const response = yield this.getContent(rest); const content = response.result; try { yield writeFile(filenameWithPath, content, { flag: 'wx' }); } catch (err) { if (err.code === 'EEXIST') { throw fileExistsError; } throw err; } return `File written successfully to ${filenameWithPath}`; }); } /** * List all files. * * Retrieves a list of all files for the specified space or project. * * @param {ListFilesParams} params - The parameters to send to the service. * @param {string} [params.projectId] - The project that contains the resource. Either `projectId` * or `spaceId` has to be given. * @param {string} [params.spaceId] - The space that contains the resource. Either `spaceId` or * `projectId` has to be given. * @param {string} [params.after] - A cursor for pagination. Use the last file ID from the * previous response to retrieve the next page. * @param {number} [params.limit] - Maximum number of files to return. Must be between 1 and * 10,000. * @param {string} [params.purpose] - Filter files by purpose. * @param {string} [params.order] - Order of results. Options are "asc" or "desc". * @param {OutgoingHttpHeaders} [params.headers] - Custom request headers * @returns {Promise<UploadedFile[]>} A promise that resolves to an array of files */ list(params) { return __awaiter(this, void 0, void 0, function* () { validateFilesParams(params, [], ['projectId', 'spaceId', 'after', 'limit', 'purpose', 'order']); const response = yield this.getDetails(params); return response.result.data; }); } } //# sourceMappingURL=files.mjs.map