openapi 文件上传是否支持远程文件上传?有没有示例

目前 官方示例中,不管是 python 还是 nodejs 实现,都是上传本地文件。

在 python openai 中,看 openai.files.create 中的 file 参数是支持二进制作为参数的。但是这种使用这种方式后,大模型答复未上传任何文件。

在 nodejs openai 中,看 openai.files.create 中的 file 参数支持 node-fetch.response 作为参数。但是这种使用方式中,会报 body used already for 的错误。

展开
收起
游客rbrv6xliemo7o 2025-03-11 18:26:19 28 发布于浙江 分享
分享
版权
举报
阿里云 AI 助理回答

问题分析

用户在使用 openai.files.create 方法上传文件时,尝试通过二进制数据(Python)或 node-fetch.Response(Node.js)作为参数,但遇到了以下问题: 1. Python:大模型答复未上传任何文件。 2. Node.js:报错 body used already for

根据知识库中的资料,openai.files.createfile 参数支持多种输入类型,包括本地文件路径、二进制数据流等。然而,实际使用中可能存在参数格式不匹配或数据流处理不当的问题。以下是针对两种语言的具体解决方案。


Python 解决方案

问题原因

在 Python 中,openai.files.createfile 参数确实支持二进制数据,但需要确保数据以正确的格式传递。如果直接传递二进制数据而未正确封装为文件对象,可能会导致上传失败。

解决方法

可以使用 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())

关键点说明

  1. BytesIO 封装:将二进制数据封装为文件对象,确保其符合 openai.files.create 的要求。
  2. 文件名设置:必须为文件对象设置 name 属性,否则可能导致上传失败。
  3. 用途参数purpose 参数需根据实际需求设置为 file-extractbatch

Node.js 解决方案

问题原因

在 Node.js 中,openai.files.createfile 参数支持 node-fetch.Response,但如果直接传递 Response 对象,可能会因为数据流已被读取而导致 body used already for 错误。

解决方法

可以通过将 Response 对象的 body 转换为 BufferReadableStream,并重新封装为文件对象。以下是示例代码:

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');

关键点说明

  1. Buffer 转换:将 Responsebody 转换为 Buffer,避免数据流被多次读取。
  2. Blob 封装:使用 BlobBuffer 封装为文件对象,确保其符合 openai.files.create 的要求。
  3. 用途参数purpose 参数需根据实际需求设置为 file-extractbatch

总结与注意事项

  1. Python:确保二进制数据通过 BytesIO 封装为文件对象,并设置文件名属性。
  2. Node.js:避免直接传递 Response 对象,而是将其 body 转换为 Buffer 并封装为 Blob
  3. 通用建议
    • 确保 purpose 参数正确设置,例如 file-extractbatch
    • 检查文件大小是否符合限制(单个文件最大 500 MB,总文件数不超过 10000 个,总存储空间不超过 100 GB)。
    • 如果问题仍未解决,建议检查 API Key 和网络连接是否正常。

通过上述方法,您可以成功上传二进制数据或远程文件,避免出现未上传文件或数据流错误的问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:

通义千问大模型家族全面升级更大参数规模模型首次面世,全新通义千问2.0版本欢迎体验。https://tongyi.aliyun.com/

还有其他疑问?
咨询AI助理