代码之家  ›  专栏  ›  技术社区  ›  Narsil91

“FastAPI POST请求返回带有可选参数的400错误请求,openai应用程序”

  •  0
  • Narsil91  · 技术社区  · 2 年前

    我正在使用FastAPI开发API,并且遇到了接受可选文本或文件参数的POST端点问题。尽管设置了这些参数的默认值,但我还是收到了一个400错误的请求错误。

    以下是我的代码的相关部分:

    from dotenv import load_dotenv
    load_dotenv()
    
    from fastapi import APIRouter, HTTPException, UploadFile, File
    import base64
    import os
    from ai_interaction.prompt import assemble_prompt
    from ai_interaction.llm import stream_openai_response
    
    router = APIRouter()
    
    @router.post("/query")  
    async def process_user_query(text: str = None, file: UploadFile = File(None)):
        print("Received text:", text)
        print("Received file:", file)
        api_key = os.getenv("OPENAI_API_KEY")
        if not api_key:
            raise HTTPException(status_code=500, detail="API key not configured.")
    
        if not text and not file:
            raise HTTPException(status_code=400, detail="No text or file provided.")
    
        if text:
            image_url = text  # Add URL validation here
        elif file:
            image_url = await process_uploaded_file(file)
    
        prompt = assemble_prompt(image_url)
        response = await stream_openai_response(prompt, api_key)
        return {"response": response}
    
    async def process_uploaded_file(file: UploadFile):
        content = await file.read()
        base64_encoded = base64.b64encode(content).decode('utf-8')
        file_url = f"data:{file.content_type};base64,{base64_encoded}"
        await file.close()
        return file_url 
    
    import requests
    
    url = "http://localhost:8000/api/query"
    payload = [{"text": "Explain the water molecule structure"}]
    response = requests.post(url, json=payload)
    print("Status Code:", response.status_code)
    print("Response Body:", response.json())
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   KRSpinelli    2 年前

    请尝试使用BaseModel分析请求正文。代码正在接收json输入,并不知道如何将其拆分为两个变量。当我在我的机器上运行你的代码时,这样的东西起了作用。

    from pydantic import BaseModel
    
    
    class Item(BaseModel):
        text: str = None
        file: UploadFile = File(None)
        
    router = APIRouter()
    
    @router.post("/query") 
    async def process_user_query(item: Item):
        text = item.text
        file = item.file