Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that <class 'main.SoluteSolvent'> is a valid pydantic field type

Tags:

python

fastapi

getting this error while executing the fast API code fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that <class 'main.SoluteSolvent'> is a valid pydantic field type

class SoluteSolvent():
    solvent: Text
    solute: Text

response = {}
@app.get('/predict')
def predict(sol:SoluteSolvent):
    data = sol.dict()
    solute = data['solute']
    solvent = data['solvent']
    results = predictions(solute, solvent)
    print(results)
    response["predictions"] = results[0].item()
    response["interaction_map"] = (results[1].detach().numpy()).tolist()
    return {'result':response}

I was actually trying to replicate the code I have written for prediction in flask in fast API.

response = {}
@app.route('/predict', methods=["POST", "GET"])
def predict():
    if request.method=='POST':
        solute = request.form["solute"]
        solvent = request.form["solvent"]

    else:
        solute = request.args.get("solute")
        solvent = request.args.get("solvent")

    results = predictions(solute, solvent)
    
    response["predictions"] = results[0].item()
    response["interaction_map"] = (results[1].detach().numpy()).tolist()
    return flask.jsonify({'result': response})
like image 606
harsh Avatar asked Jan 02 '26 07:01

harsh


2 Answers

The error says your type you pass to predict must be pydantic BaseModel (or dataclass from 0.67.0 version of FastApi). However it won't work that way (at least on get request), if you want to pass query params (suggested solution) list them in function:

@app.get('/predict')
def predict(solute: str, solvent: str):
   print(solute, solvent)

And use model for post request (which expects data in body):

from pydantic import BaseModel
class SoluteSolvent(BaseModel):
    solvent: str
    solute: str

@app.post('/predict')
def predict(sol:SoluteSolvent):
    print(sol.solute)

Or you can use underlying starlette Request directly

from fastapi import Request

async def predict(r: Request):
    print(r.query_params["solute"])
like image 82
kosciej16 Avatar answered Jan 03 '26 21:01

kosciej16


I had a similar error. I was getting:
fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that <class 'sqlalchemy.orm.session.Session'> is a valid Pydantic field type.

The fix:
My API looked like this:

@api_router.post(
    "/", status_code=status.HTTP_201_CREATED, response_model=VehicleReadSchema
)
def create_vehicle(vehicle: VehicleCreateSchema, db: Session):
    db_vehicle = Vehicle(**vehicle.model_dump())
    db.add(db_vehicle)
    db.commit()
    db.refresh(db_vehicle)
    return VehicleReadSchema.model_validate(db_vehicle)

I changed this into:

from app.core.database import get_db


@api_router.post(
    "/", status_code=status.HTTP_201_CREATED, response_model=VehicleReadSchema
)
def create_vehicle(vehicle: VehicleCreateSchema, db: Session = Depends(get_db)):
    db_vehicle = Vehicle(**vehicle.model_dump())
    db.add(db_vehicle)
    db.commit()
    db.refresh(db_vehicle)
    return VehicleReadSchema.model_validate(db_vehicle)

The problem:

The function get_db returns us a SQLAlchemy db Session which is a dependency.

# Dependency to get DB session
def get_db():
    db = SessionLocal()
    try:
        yield db  # Provide the session
    finally:
        db.close()  # Cleanup

Just mentioning "db:Session" does not work.
Hope this helps.

like image 31
Arindam Roychowdhury Avatar answered Jan 03 '26 22:01

Arindam Roychowdhury



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!