main
py 61 lines 1.94 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
5 from http import HTTPStatus
6 from typing import Annotated
7
8 from fastapi import APIRouter, Form, Request
9 from fastapi.responses import JSONResponse, StreamingResponse
10
11 from vllm.entrypoints.serve.engine.protocol import ErrorResponse
12 from vllm.entrypoints.serve.utils.api_utils import (
13 load_aware_call,
14 with_cancellation,
15 )
16 from vllm.entrypoints.speech_to_text.base.utils import read_upload_with_limit
17 from vllm.logger import init_logger
18
19 from .protocol import TranslationRequest, TranslationResponseVariant
20 from .serving import OpenAIServingTranslation
21
22 logger = init_logger(__name__)
23
24 router = APIRouter()
25
26
27 def translation(request: Request) -> OpenAIServingTranslation:
28 return request.app.state.openai_serving_translation
29
30
31 @router.post(
32 "/v1/audio/translations",
33 responses={
34 HTTPStatus.OK.value: {"content": {"text/event-stream": {}}},
35 HTTPStatus.BAD_REQUEST.value: {"model": ErrorResponse},
36 HTTPStatus.UNPROCESSABLE_ENTITY.value: {"model": ErrorResponse},
37 HTTPStatus.INTERNAL_SERVER_ERROR.value: {"model": ErrorResponse},
38 },
39 )
40 @with_cancellation
41 @load_aware_call
42 async def create_translations(
43 request: Annotated[TranslationRequest, Form()], raw_request: Request
44 ):
45 handler = translation(raw_request)
46 if handler is None:
47 raise NotImplementedError("The model does not support Translations API")
48
49 audio_data = await read_upload_with_limit(request.file)
50
51 generator = await handler.create_translation(audio_data, request, raw_request)
52
53 if isinstance(generator, ErrorResponse):
54 return JSONResponse(
55 content=generator.model_dump(), status_code=generator.error.code
56 )
57
58 elif isinstance(generator, TranslationResponseVariant):
59 return JSONResponse(content=generator.model_dump())
60
61 return StreamingResponse(content=generator, media_type="text/event-stream")