目前 官方示例中,不管是 python 还是 nodejs 实现,都是上传本地文件。
在 python openai 中,看 openai.files.create 中的 file 参数是支持二进制作为参数的。但是这种使用这种方式后,大模型答复未上传任何文件。
在 nodejs openai 中,看 openai.files.create 中的 file 参数支持 node-fetch.response 作为参数。但是这种使用方式中,会报 body used already for 的错误。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
用户在使用 openai.files.create
方法上传文件时,尝试通过二进制数据(Python)或 node-fetch.Response
(Node.js)作为参数,但遇到了以下问题: 1. Python:大模型答复未上传任何文件。 2. Node.js:报错 body used already for
。
根据知识库中的资料,openai.files.create
的 file
参数支持多种输入类型,包括本地文件路径、二进制数据流等。然而,实际使用中可能存在参数格式不匹配或数据流处理不当的问题。以下是针对两种语言的具体解决方案。
在 Python 中,openai.files.create
的 file
参数确实支持二进制数据,但需要确保数据以正确的格式传递。如果直接传递二进制数据而未正确封装为文件对象,可能会导致上传失败。
可以使用 io.BytesIO
将二进制数据封装为文件对象,并确保其符合 openai.files.create
的要求。以下是示例代码:
import os
from io import BytesIO
from openai import OpenAI
# 初始化客户端
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 假设 binary_data 是从其他来源获取的二进制数据
binary_data = b"这是测试的二进制数据内容"
# 使用 BytesIO 将二进制数据封装为文件对象
file_object = BytesIO(binary_data)
file_object.name = "test.txt" # 必须指定文件名
# 调用 create 方法上传文件
response = client.files.create(file=file_object, purpose="file-extract")
# 打印返回结果
print(response.model_dump_json())
BytesIO
封装:将二进制数据封装为文件对象,确保其符合 openai.files.create
的要求。name
属性,否则可能导致上传失败。purpose
参数需根据实际需求设置为 file-extract
或 batch
。在 Node.js 中,openai.files.create
的 file
参数支持 node-fetch.Response
,但如果直接传递 Response
对象,可能会因为数据流已被读取而导致 body used already for
错误。
可以通过将 Response
对象的 body
转换为 Buffer
或 ReadableStream
,并重新封装为文件对象。以下是示例代码:
const fetch = require('node-fetch');
const { OpenAI } = require('openai');
// 初始化客户端
const client = new OpenAI({
apiKey: process.env.DASHSCOPE_API_KEY,
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
});
async function uploadFileFromUrl(url) {
try {
// 获取远程文件的 Response 对象
const response = await fetch(url);
// 将 Response 的 body 转换为 Buffer
const buffer = await response.buffer();
// 创建文件对象
const file = new Blob([buffer], { type: response.headers.get('content-type') });
// 调用 create 方法上传文件
const fileObject = await client.files.create({
file: file,
purpose: 'file-extract',
});
// 打印返回结果
console.log(JSON.stringify(fileObject));
} catch (error) {
console.error(`发生错误:${error.message}`);
}
}
// 示例调用
uploadFileFromUrl('https://example.com/test.txt');
Buffer
转换:将 Response
的 body
转换为 Buffer
,避免数据流被多次读取。Blob
封装:使用 Blob
将 Buffer
封装为文件对象,确保其符合 openai.files.create
的要求。purpose
参数需根据实际需求设置为 file-extract
或 batch
。BytesIO
封装为文件对象,并设置文件名属性。Response
对象,而是将其 body
转换为 Buffer
并封装为 Blob
。purpose
参数正确设置,例如 file-extract
或 batch
。通过上述方法,您可以成功上传二进制数据或远程文件,避免出现未上传文件或数据流错误的问题。