model_router.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from fastapi import APIRouter, Body
  2. from pydantic import BaseModel
  3. from starlette.requests import Request
  4. from modelscope.utils.input_output import \
  5. pipeline_output_to_service_base64_output # noqa E125
  6. from modelscope.utils.input_output import call_pipeline_with_json
  7. router = APIRouter()
  8. @router.post('/call')
  9. async def inference(
  10. request: Request,
  11. body: BaseModel = Body(examples=[{
  12. 'usage': 'copy body from describe'
  13. }])): # noqa E125
  14. """Inference general interface.
  15. For image, video, audio etc binary data, need encoded with base64.
  16. Args:
  17. request (Request): The request object.
  18. request_info (ModelScopeRequest): The post body.
  19. Returns:
  20. ApiResponse: For binary field, encoded with base64
  21. """
  22. pipeline_service = request.app.state.pipeline
  23. pipeline_info = request.app.state.pipeline_info
  24. request_json = await request.json()
  25. result = call_pipeline_with_json(pipeline_info, pipeline_service,
  26. request_json)
  27. # convert output to json, if binary field, we need encoded.
  28. output = pipeline_output_to_service_base64_output(
  29. pipeline_info['task_name'], result)
  30. return output
  31. @router.get('/describe')
  32. async def describe(request: Request):
  33. info = {}
  34. info['schema'] = request.app.state.pipeline_info
  35. info['sample'] = request.app.state.pipeline_sample
  36. return info