1515class VetiverAPI :
1616 """Create model aware API
1717
18- Attributes
18+ Parameters
1919 ----------
2020 model : VetiverModel
2121 Model to be deployed in API
2222 check_ptype : bool
2323 Determine if data prototype should be enforced
2424 app_factory :
2525 Type of API to be deployed
26- app :
27- API that is deployed
26+
27+ Example
28+ -------
29+ >>> import vetiver
30+ >>> X, y = vetiver.get_mock_data()
31+ >>> model = vetiver.get_mock_model().fit(X, y)
32+ >>> v = vetiver.VetiverModel(model = model, model_name = "my_model", ptype_data = X)
33+ >>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)
2834 """
2935
3036 app = None
@@ -133,7 +139,7 @@ async def rapidoc():
133139 def vetiver_post (
134140 self , endpoint_fx : Callable , endpoint_name : str = "custom_endpoint"
135141 ):
136- """Create new POST endpoint
142+ """Create new POST endpoint that is aware of model input data
137143
138144 Parameters
139145 ----------
@@ -142,25 +148,31 @@ def vetiver_post(
142148 endpoint_name : str
143149 Name of endpoint
144150
145- Returns
151+ Example
146152 -------
147- dict
148- Key: endpoint_name Value: Output of endpoint_fx, in list format
153+ >>> import vetiver
154+ >>> X, y = vetiver.get_mock_data()
155+ >>> model = vetiver.get_mock_model().fit(X, y)
156+ >>> v = vetiver.VetiverModel(model = model, model_name = "model", ptype_data = X)
157+ >>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)
158+ >>> def sum_values(x):
159+ ... return x.sum()
160+ >>> v_api.vetiver_post(sum_values, "sums")
149161 """
150162 if self .check_ptype is True :
151163
152164 @self .app .post ("/" + endpoint_name )
153165 async def custom_endpoint (input_data : self .model .ptype ):
154166 y = _prepare_data (input_data )
155- new = endpoint_fx (pd .Series (y ))
167+ new = endpoint_fx (pd .DataFrame (y ))
156168 return {endpoint_name : new .tolist ()}
157169
158170 else :
159171
160172 @self .app .post ("/" + endpoint_name )
161173 async def custom_endpoint (input_data : Request ):
162174 y = await input_data .json ()
163- new = endpoint_fx (pd .Series (y ))
175+ new = endpoint_fx (pd .DataFrame (y ))
164176
165177 return {endpoint_name : new .tolist ()}
166178
@@ -174,6 +186,15 @@ def run(self, port: int = 8000, host: str = "127.0.0.1", **kw):
174186 An integer that indicates the server port that should be listened on.
175187 host : str
176188 A valid IPv4 or IPv6 address, which the application will listen on.
189+
190+ Example
191+ -------
192+ >>> import vetiver
193+ >>> X, y = vetiver.get_mock_data()
194+ >>> model = vetiver.get_mock_model().fit(X, y)
195+ >>> v = vetiver.VetiverModel(model = model, model_name = "model", ptype_data = X)
196+ >>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)
197+ >>> v_api.run() # doctest: +SKIP
177198 """
178199 _jupyter_nb ()
179200 uvicorn .run (self .app , port = port , host = host , ** kw )
@@ -209,6 +230,13 @@ def predict(endpoint, data: Union[dict, pd.DataFrame, pd.Series], **kw):
209230 -------
210231 dict
211232 Endpoint_name and list of endpoint_fx output
233+
234+ Example
235+ -------
236+ >>> import vetiver
237+ >>> X, y = vetiver.get_mock_data()
238+ >>> endpoint = vetiver.vetiver_endpoint(url='http://127.0.0.1:8000/predict')
239+ >>> vetiver.predict(endpoint, X) # doctest: +SKIP
212240 """
213241 if isinstance (endpoint , testclient .TestClient ):
214242 requester = endpoint
@@ -273,5 +301,10 @@ def vetiver_endpoint(url="http://127.0.0.1:8000/predict"):
273301 -------
274302 url : str
275303 URI path to endpoint
304+
305+ Example
306+ -------
307+ >>> import vetiver
308+ >>> endpoint = vetiver.vetiver_endpoint(url='http://127.0.0.1:8000/predict')
276309 """
277310 return url
0 commit comments