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})
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"])
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With