Skip to content

Commit c055ca2

Browse files
amirai21asafgardin
authored andcommitted
feat: support node path and file object\ and browser file object
1 parent 48f2a8d commit c055ca2

File tree

4 files changed

+65
-70
lines changed

4 files changed

+65
-70
lines changed

examples/studio/conversational-rag/rag-engine.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AI21 } from 'ai21';
2-
import { FilePathOrFileObject, FileResponse, UploadFileResponse } from '../../../src/types/rag';
2+
import { FileResponse, UploadFileResponse } from '../../../src/types/rag';
33

44
async function waitForFileProcessing(
55
client: AI21,
@@ -21,11 +21,9 @@ async function waitForFileProcessing(
2121
async function uploadQueryUpdateDelete(fileInput) {
2222
const client = new AI21({ apiKey: process.env.AI21_API_KEY });
2323
try {
24-
const uploadFileResponse: UploadFileResponse = await client.ragEngine.create(
25-
fileInput,
26-
{ path: 'test10' },
27-
);
28-
24+
const uploadFileResponse: UploadFileResponse = await client.ragEngine.create(fileInput, {
25+
path: 'test10',
26+
});
2927

3028
const fileId = uploadFileResponse.fileId;
3129
let file: FileResponse = await waitForFileProcessing(client, fileId);
@@ -52,10 +50,11 @@ async function listFiles() {
5250
console.log(files);
5351
}
5452

55-
const filePath = '/Users/amirkoblyansky/Documents/ukraine.txt'
53+
const filePath = '/Users/amirkoblyansky/Documents/ukraine.txt';
5654
const fileContent = Buffer.from('This is the content of the file.');
5755
const dummyFile = new File([fileContent], 'example.txt', { type: 'text/plain' });
5856

57+
uploadQueryUpdateDelete(filePath).catch(console.error);
5958
uploadQueryUpdateDelete(dummyFile).catch(console.error);
6059

61-
// listFiles().catch(console.error);
60+
listFiles().catch(console.error);

src/APIClient.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,3 @@ export abstract class APIClient {
190190
);
191191
}
192192
}
193-

src/files/form-utils.ts

Lines changed: 49 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,71 +7,70 @@ import { Readable } from 'stream';
77

88
// eslint-disable-next-line @typescript-eslint/no-explicit-any
99
export const appendBodyToFormData = (formData: UnifiedFormData, body: Record<string, any>): void => {
10-
for (const [key, value] of Object.entries(body)) {
11-
if (Array.isArray(value)) {
12-
value.forEach((item) => formData.append(key, item));
13-
} else {
14-
formData.append(key, value);
15-
}
10+
for (const [key, value] of Object.entries(body)) {
11+
if (Array.isArray(value)) {
12+
value.forEach((item) => formData.append(key, item));
13+
} else {
14+
formData.append(key, value);
1615
}
17-
};
16+
}
17+
};
1818

1919
// Convert WHATWG ReadableStream to Node.js Readable Stream
2020
function convertReadableStream(whatwgStream: ReadableStream): Readable {
21-
const reader = whatwgStream.getReader();
21+
const reader = whatwgStream.getReader();
2222

23-
return new Readable({
24-
async read() {
25-
const { done, value } = await reader.read();
26-
if (done) {
27-
this.push(null);
28-
} else {
29-
this.push(value);
30-
}
31-
},
32-
});
23+
return new Readable({
24+
async read() {
25+
const { done, value } = await reader.read();
26+
if (done) {
27+
this.push(null);
28+
} else {
29+
this.push(value);
30+
}
31+
},
32+
});
3333
}
3434

35-
3635
export async function createFormData(file: FilePathOrFileObject): Promise<UnifiedFormData> {
36+
if (Runtime.isBrowser) {
37+
const formData = new FormData();
3738

38-
if (Runtime.isBrowser) {
39-
const formData = new FormData();
40-
41-
if (file instanceof window.File) {
42-
formData.append('file', file);
43-
} else {
44-
throw new Error('Unsupported file type in browser');
45-
}
46-
47-
return formData;
48-
} else { // Node environment:
39+
if (file instanceof window.File) {
40+
formData.append('file', file);
41+
} else {
42+
throw new Error('Unsupported file type in browser');
43+
}
4944

50-
const { default: FormDataNode } = await import('form-data');
51-
const formData = new FormDataNode();
45+
return formData;
46+
} else {
47+
// Node environment:
5248

53-
if (typeof file === 'string') {
54-
const { createReadStream } = await import('fs');
55-
formData.append('file', createReadStream(file), { filename: file.split('/').pop() });
56-
} else if (Buffer.isBuffer(file)) {
57-
formData.append('file', file, { filename: 'TODO - add filename to buffer flow' });
58-
} else if (file instanceof File) {
59-
const nodeStream = convertReadableStream(file.stream());
60-
formData.append('file', nodeStream, file.name);
61-
} else {
62-
throw new Error('Unsupported file type in Node.js');
63-
}
49+
const { default: FormDataNode } = await import('form-data');
50+
const formData = new FormDataNode();
6451

65-
return formData;
52+
if (typeof file === 'string') {
53+
const { createReadStream } = await import('fs');
54+
formData.append('file', createReadStream(file), { filename: file.split('/').pop() });
55+
} else if (Buffer.isBuffer(file)) {
56+
formData.append('file', file, { filename: 'TODO - add filename to buffer flow' });
57+
} else if (file instanceof File) {
58+
const nodeStream = convertReadableStream(file.stream());
59+
formData.append('file', nodeStream, file.name);
60+
} else {
61+
throw new Error('Unsupported file type in Node.js');
6662
}
63+
64+
return formData;
65+
}
6766
}
6867

6968
export async function getBoundary(formData: UnifiedFormData): Promise<string | undefined> {
70-
if (!Runtime.isBrowser) {
71-
const { default: FormDataNode } = await import('form-data');
72-
if (formData instanceof FormDataNode) {
73-
return formData.getBoundary();
74-
}
69+
if (!Runtime.isBrowser) {
70+
const { default: FormDataNode } = await import('form-data');
71+
if (formData instanceof FormDataNode) {
72+
return formData.getBoundary();
7573
}
76-
return undefined;
74+
}
75+
return undefined;
7776
}

src/resources/rag/ragEngine.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
import * as Models from '../../types';
22
import { APIResource } from '../../APIResource';
3-
import { UploadFileResponse, UploadFileRequest, ListFilesFilters, UpdateFileRequest, FilePathOrFileObject } from '../../types/rag';
3+
import {
4+
UploadFileResponse,
5+
UploadFileRequest,
6+
ListFilesFilters,
7+
UpdateFileRequest,
8+
FilePathOrFileObject,
9+
} from '../../types/rag';
410
import { FileResponse } from 'types/rag/FileResponse';
511

612
const RAG_ENGINE_PATH = '/library/files';
713

814
export class RAGEngine extends APIResource {
9-
create(
10-
file: string,
11-
body: UploadFileRequest,
12-
options?: Models.RequestOptions,
13-
): Promise<UploadFileResponse>;
15+
create(file: string, body: UploadFileRequest, options?: Models.RequestOptions): Promise<UploadFileResponse>;
1416

15-
create(
16-
file: File,
17-
body: UploadFileRequest,
18-
options?: Models.RequestOptions,
19-
): Promise<UploadFileResponse>;
17+
create(file: File, body: UploadFileRequest, options?: Models.RequestOptions): Promise<UploadFileResponse>;
2018

2119
create(
2220
file: FilePathOrFileObject,

0 commit comments

Comments
 (0)