openai-node
openai-node copied to clipboard
400 'file' is a required property when Creating File in CloudFlare Worker
Confirm this is a Node library issue and not an underlying OpenAI API issue
- [X] This is an issue with the Node library
Describe the bug
I get the following error when I try to create a file from a CloudFlare worker environment.
{
error: {
message: "'file' is a required property",
type: 'invalid_request_error',
param: null,
code: null
}
}
I'm able to successfully create a file from a vanilla nodejs environment. I've also confirmed that CURL requests are working.
To Reproduce
Run the following code in a CloudFlare worker environment.
const llm = new OpenAI({
apiKey: env.OPENAI_API_KEY,
});
const file = await toFile(
new FormDataBlob([
new TextEncoder().encode("text is here"),
]),
"finetune.jsonl"
);
const res = await llm.files.create({
file,
purpose: "fine-tune",
});
Code snippets
No response
OS
macOS
Node version
v18.0.0
Library version
4.38.5
Has anyone else experienced this? This is a product level blocker on my end and I'm willing to assist in the fix.
Thanks for reporting, we'll take a look soon. In the meantime, you might try methods other than FormDataBlob
to instantiate the file contents, like converting the string to an ArrayBuffer
.
I came up against this as well. I was trying to upload a PDF, but couldn't get the lib to accept anything other than a FsFileStream from fs.createReadStream
. Not blobs, buffers, formdata Files, nothing. It'd either error with the OP's 'file' is required property
, or reject the type in addFormValue
.
It'd be nice if it could accept a regular Readable stream, not just a file stream from fs
. Or maybe a custom openai
File object that specified the buffer/stream plus filename and other file metadata that a plain stream / buffer doesn't specify.
After looking at the code, my workaround was to make something that would pass through isFileLike()
. This works:
const file = {
type: 'application/pdf',
name: 'test.pdf',
filename: 'test.pdf',
lastModified: new Date().getTime(),
arrayBuffer: () => convertThingYouHaveToBuffer(),
// It doesn't use these, but it needs them to work around type checking
size: 1,
text: () => '',
slice: () => [],
}
@benogle I've tried that and am still getting the same error. Here is my code:
const id = uuidv4();
await env.DOC_BUCKET.put(id, trainingStr);
const obj = await env.DOC_BUCKET.get(id);
const file = {
type: "application/jsonl",
name: "training.jsonl",
filename: "training.jsonl",
lastModified: new Date().getTime(),
arrayBuffer: async () => await obj.arrayBuffer(),
// It doesn't use these, but it needs them to work around type checking
size: 1,
text: async () => await obj.text(),
slice: (): any => [],
};
const res = await llm.files.create({
file,
purpose: "fine-tune",
});
Sorry we haven't been able to take a look at this yet. We've been backed up with other things but do hope to get to it in the next month or so.