You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Cloudflare Workers(Pyodide异步环境)调用Stability AI SD3 API时的流式请求异常问题咨询

在Cloudflare Workers(Pyodide异步环境)调用Stability AI SD3 API时的流式请求异常问题咨询

我来帮你分析和解决这个问题~ 你遇到的「Attempted to access streaming request content, without having called read()」异常,主要是因为在Pyodide(Cloudflare Workers的Python运行环境)中,httpx处理multipart请求的方式和普通Python环境有差异,再加上你之前的请求构造逻辑有一些不合理的地方。

问题根源拆解

  1. 错误的Multipart请求构造:你把所有普通参数都放到了files参数中,还额外添加了一个空文件empty.txt,这不仅不符合Stability AI SD3接口的要求(text-to-image场景不需要上传文件,仅需传递表单字段),还会导致httpx在处理请求流时出现异常。
  2. 响应读取逻辑适配问题:Pyodide环境中的httpx AsyncResponse处理和标准Python环境略有不同,你使用的await response.aread()并非httpx的标准异步读取方法,容易触发流读取异常。
  3. Certifi路径潜在问题:在Pyodide中指定certifi.where()可能会出现证书路径无法识别的情况,Cloudflare Workers本身自带可信CA根证书,无需额外指定。

修正后的代码示例

下面是调整后的完整代码,每一步的修改都做了注释:

import httpx
from js import console

async def simple_image_generator(api_key, params, timeout=1000):
    if not api_key:
        raise Exception("API key is required")
    
    url = "https://api.stability.ai/v2beta/stable-image/generate/sd3"
    headers = {
        "Accept": "application/json, image/*",
        "Authorization": f"Bearer {api_key}",
        # 无需手动设置Content-Type,httpx会自动根据data参数生成multipart/form-data
    }

    # 直接用data传递表单字段,httpx会自动编码为符合要求的multipart/form-data格式
    form_data = params.copy()

    # Cloudflare Workers环境中可直接使用默认证书验证,无需指定certifi路径
    async with httpx.AsyncClient(verify=True) as client:
        try:
            console.info(f"\n[image_simple] Trying to POST {url}\n")
            response = await client.post(
                url,
                headers=headers,
                data=form_data,  # 替换原有的files参数,传递普通表单字段
                timeout=timeout,
            )
            # 使用httpx标准异步读取方法读取响应内容
            response_content = await response.read()
            # 将读取后的内容绑定到response对象,确保后续可正常访问content等属性
            response._content = response_content
            
            response.raise_for_status()
            console.info("\n[image_simple] API Request sent successfully\n")
            return response
        except httpx.HTTPStatusError as e:
            console.error(f"\n[image_simple] HTTP Error: {e.response.status_code} - {str(e)}\n")
            raise Exception(f"API request failed with status {e.response.status_code}: {str(e)}") from e
        except httpx.TimeoutException:
            console.error("\n[image_simple] Exception: Request timed out\n")
            raise Exception("API request timed out")
        except Exception as e:
            console.error(f"\n[image_simple] Exception: {str(e)}\n")
            raise Exception(f"API request failed: {str(e)}") from e

关键修改说明

  1. 简化请求构造:用data参数传递所有表单字段(比如prompt、mode等),httpx会自动帮你生成符合要求的multipart/form-data请求体,完全不需要手动构造files列表。
  2. 修复响应读取:改用httpx标准的await response.read()异步读取方法,读取后将内容绑定到response._content,确保后续可以正常访问response.content、response.json()等属性。
  3. 优化证书验证:移除了certifi.where()的指定,直接使用verify=True,Cloudflare Workers环境会自动处理HTTPS证书验证。
  4. 细化异常捕获:新增了针对HTTP状态错误、超时错误的单独捕获,方便你更精准地排查问题。

额外注意事项

  • 确认timeout参数单位:httpx的timeout参数默认单位是秒,如果你设置的1000是指1000毫秒,记得改成1.0。
  • 参数合法性检查:确保params中的字段完全符合Stability AI SD3接口的要求(比如mode必须是text-to-image,model为sd3等),避免因参数错误导致接口返回异常。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:38:07