2022-05-20 10:56:34 -07:00
(serve-http-adapters)=
# HTTP Adapters
2022-08-02 13:08:05 -07:00
HTTP adapters are functions that convert raw HTTP requests to basic Python types that you know and recognize.
2022-05-20 10:56:34 -07:00
2022-08-02 13:08:05 -07:00
For example, here is an adapter that extracts the JSON content from a request:
2022-05-20 10:56:34 -07:00
```python
async def json_resolver(request: starlette.requests.Request):
return await request.json()
```
2022-08-02 13:08:05 -07:00
The input arguments to an HTTP adapter should be type-annotated. At a minimum, the adapter should accept a `starlette.requests.Request` type (https://www.starlette.io/requests/#request ),
but it can also accept any type that's recognized by [FastAPI's dependency injection framework ](https://fastapi.tiangolo.com/tutorial/dependencies/ ).
Here is an HTTP adapter that accepts two HTTP query parameters:
2022-05-20 10:56:34 -07:00
```python
def parse_query_args(field_a: int, field_b: str):
return YourDataClass(field_a, field_b)
```
2022-08-02 13:08:05 -07:00
You can specify different type signatures to facilitate the extraction of HTTP fields, including
- [query parameters ](https://fastapi.tiangolo.com/tutorial/query-params/ ),
- [body parameters ](https://fastapi.tiangolo.com/tutorial/body/ ),
and
- [many other data types ](https://fastapi.tiangolo.com/tutorial/extra-data-types/ ).
For more details, you can take a look at the [FastAPI documentation ](https://fastapi.tiangolo.com/ ).
2022-05-20 10:56:34 -07:00
2022-08-02 13:08:05 -07:00
You can use adapters in different scenarios within Serve, which we will go over one by one:
2022-05-20 10:56:34 -07:00
2022-07-05 13:26:49 -07:00
- Ray AIR `Predictor`
2022-05-20 10:56:34 -07:00
- Serve Deployment Graph `DAGDriver`
- Embedded in Bring Your Own `FastAPI` Application
2022-07-05 13:26:49 -07:00
## Ray AIR `Predictor`
2022-05-20 10:56:34 -07:00
Ray Serve provides a suite of adapters to convert HTTP requests to ML inputs like `numpy` arrays.
2022-08-02 13:08:05 -07:00
You can use them together with the [Ray AI Runtime (AIR) model wrapper ](air-serving-guide ) feature
to one-click deploy pre-trained models.
2022-05-20 10:56:34 -07:00
2022-08-02 13:08:05 -07:00
As an example, we provide a simple adapter for an *n* -dimensional array.
2022-05-20 10:56:34 -07:00
2022-08-02 13:08:05 -07:00
When using [model wrappers ](air-serving-guide ), you can specify your HTTP adapter via the `http_adapter` field:
2022-05-20 10:56:34 -07:00
```python
from ray import serve
from ray.serve.http_adapters import json_to_ndarray
2022-07-05 13:26:49 -07:00
from ray.serve import PredictorDeployment
2022-05-20 10:56:34 -07:00
2022-07-05 13:26:49 -07:00
PredictorDeployment.options(name="my_model").deploy(
2022-05-20 10:56:34 -07:00
my_ray_air_predictor,
my_ray_air_checkpoint,
http_adapter=json_to_ndarray
)
```
## Serve Deployment Graph `DAGDriver`
2022-08-02 13:08:05 -07:00
When using a [Serve Deployment Graph ](serve-deployment-graph ), you can configure
`ray.serve.drivers.DAGDriver` to accept an HTTP adapter via its `http_adapter` field.
2022-05-20 10:56:34 -07:00
2022-08-02 13:08:05 -07:00
For example, the `json_request` adapter parses JSON in the HTTP body:
2022-05-20 10:56:34 -07:00
```python
from ray.serve.drivers import DAGDriver
from ray.serve.http_adapters import json_request
2022-06-16 19:15:39 -07:00
from ray.dag.input_node import InputNode
2022-05-20 10:56:34 -07:00
with InputNode() as input_node:
2022-08-02 13:08:05 -07:00
# ...
2022-05-20 10:56:34 -07:00
dag = DAGDriver.bind(other_node, http_adapter=json_request)
```
2022-08-02 13:08:05 -07:00
## Embedded in your existing `FastAPI` Application
2022-05-20 10:56:34 -07:00
You can also bring the adapter to your own FastAPI app using
[Depends ](https://fastapi.tiangolo.com/tutorial/dependencies/#import-depends ).
The input schema will automatically be part of the generated OpenAPI schema with FastAPI.
```python
from fastapi import FastAPI, Depends
from ray.serve.http_adapters import json_to_ndarray
app = FastAPI()
@app .post("/endpoint")
async def endpoint(np_array = Depends(json_to_ndarray)):
...
```
It has the following schema for input:
(serve-ndarray-schema)=
```{eval-rst}
.. autopydantic_model:: ray.serve.http_adapters.NdArray
```
2022-08-02 13:08:05 -07:00
## Pydantic models as adapters
Serve also supports [pydantic models ](https://pydantic-docs.helpmanual.io/usage/models/ ) as a shorthand for HTTP adapters in model wrappers. Instead of using a function to define your HTTP adapter as in the examples above,
you can directly pass in a pydantic model class to effectively tell Ray Serve "validate the HTTP body with this schema."
Once validated, the model instance will passed to the predictor.
```python
from pydantic import BaseModel
class User(BaseModel):
user_id: int
user_name: str
# ...
PredictorDeployment.deploy(..., http_adapter=User)
# Or:
DAGDriver.bind(other_node, http_adapter=User)
```
2022-05-20 10:56:34 -07:00
## List of Built-in Adapters
2022-08-02 13:08:05 -07:00
Here is a list of adapters; please feel free to [contribute more ](https://github.com/ray-project/ray/issues/new/choose )!
2022-05-20 10:56:34 -07:00
```{eval-rst}
.. automodule:: ray.serve.http_adapters
2022-06-10 09:19:42 -07:00
:members: json_to_ndarray, image_to_ndarray, starlette_request, json_request, pandas_read_json, json_to_multi_ndarray
2022-05-20 10:56:34 -07:00
2022-08-02 13:08:05 -07:00
```