async def METHOD_NAME(
    self, inp: t.Any = None, *, _bentoml_api: InferenceAPI[t.Any], **kwargs: t.Any
) -> t.Any:
    # All gRPC kwargs should be poped out.
    kwargs = {k: v for k, v in kwargs.items() if not k.startswith("_grpc_")}
    api = _bentoml_api
    if api.multi_input:
        if inp is not None:
            raise BentoMLException(
                f"'{api.name}' takes multiple inputs; all inputs must be passed as keyword arguments."
            )
        fake_resp = await api.input.to_http_response(kwargs, None)
    else:
        fake_resp = await api.input.to_http_response(inp, None)
    # TODO: Temporary workaround before moving everything to StreamingResponse
    if isinstance(fake_resp, starlette.responses.StreamingResponse):
        req_body = "".join([s async for s in fake_resp.body_iterator])
    else:
        req_body = fake_resp.body
    async with aiohttp.ClientSession(self.server_url) as sess:
        async with sess.post(
            "/" + api.route if not api.route.startswith("/") else api.route,
            data=req_body,
            headers={"content-type": fake_resp.headers["content-type"]},
        ) as resp:
            if resp.status != 200:
                raise BentoMLException(
                    f"Error making request: {resp.status}: {str(await resp.read())}"
                )
            fake_req = starlette.requests.Request(scope={"type": "http"})
            headers = starlette.datastructures.Headers(headers=resp.headers)
            fake_req._body = await resp.read()
            # Request.headers sets a _headers variable. We will need to set this
            # value to our fake request object.
            fake_req._headers = headers  # type: ignore (request._headers is property)
    return await api.output.from_http_request(fake_req)