main
py 61 lines 1.96 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.utils.api_utils import (
12 load_aware_call,
13 with_cancellation,
14 )
15 from vllm.entrypoints.speech_to_text.base.utils import read_upload_with_limit
16 from vllm.logger import init_logger
17
18 from ...serve.engine.protocol import ErrorResponse
19 from .protocol import TranscriptionRequest, TranscriptionResponseVariant
20 from .serving import OpenAIServingTranscription
21
22 logger = init_logger(__name__)
23
24 router = APIRouter()
25
26
27 def transcription(request: Request) -> OpenAIServingTranscription:
28 return request.app.state.openai_serving_transcription
29
30
31 @router.post(
32 "/v1/audio/transcriptions",
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_transcriptions(
43 raw_request: Request, request: Annotated[TranscriptionRequest, Form()]
44 ):
45 handler = transcription(raw_request)
46 if handler is None:
47 raise NotImplementedError("The model does not support Transcriptions API")
48
49 audio_data = await read_upload_with_limit(request.file)
50
51 generator = await handler.create_transcription(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, TranscriptionResponseVariant):
59 return JSONResponse(content=generator.model_dump())
60
61 return StreamingResponse(content=generator, media_type="text/event-stream")