main
py 97 lines 3.29 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 from collections.abc import AsyncGenerator
4
5 from fastapi import Request
6
7 from vllm.engine.protocol import EngineClient
8 from vllm.entrypoints.generate.base.protocol import RequestResponseMetadata
9 from vllm.entrypoints.openai.models.serving import OpenAIServingModels
10 from vllm.entrypoints.serve.engine.protocol import ErrorResponse
11 from vllm.entrypoints.serve.utils.request_logger import RequestLogger
12 from vllm.logger import init_logger
13 from vllm.outputs import RequestOutput
14
15 from ..base.serving import SpeechToTextBaseServing
16 from .protocol import (
17 TranslationRequest,
18 TranslationResponse,
19 TranslationResponseStreamChoice,
20 TranslationResponseVerbose,
21 TranslationStreamResponse,
22 )
23
24 logger = init_logger(__name__)
25
26
27 class OpenAIServingTranslation(SpeechToTextBaseServing):
28 """Handles translation requests."""
29
30 def __init__(
31 self,
32 engine_client: EngineClient,
33 models: OpenAIServingModels,
34 *,
35 request_logger: RequestLogger | None,
36 return_tokens_as_token_ids: bool = False,
37 enable_force_include_usage: bool = False,
38 ):
39 super().__init__(
40 engine_client=engine_client,
41 models=models,
42 request_logger=request_logger,
43 return_tokens_as_token_ids=return_tokens_as_token_ids,
44 task_type="translate",
45 enable_force_include_usage=enable_force_include_usage,
46 )
47
48 async def create_translation(
49 self,
50 audio_data: bytes,
51 request: TranslationRequest,
52 raw_request: Request | None = None,
53 ) -> (
54 TranslationResponse
55 | TranslationResponseVerbose
56 | AsyncGenerator[str, None]
57 | ErrorResponse
58 ):
59 """Translation API similar to OpenAI's API.
60
61 See https://platform.openai.com/docs/api-reference/audio/createTranslation
62 for the API specification. This API mimics the OpenAI translation API.
63 """
64 return await self._create_speech_to_text(
65 audio_data=audio_data,
66 request=request,
67 raw_request=raw_request,
68 response_class=(
69 TranslationResponseVerbose
70 if request.response_format == "verbose_json"
71 else TranslationResponse
72 ),
73 stream_generator_method=self.translation_stream_generator,
74 )
75
76 async def translation_stream_generator(
77 self,
78 request: TranslationRequest,
79 result_generator: list[AsyncGenerator[RequestOutput, None]],
80 request_id: str,
81 request_metadata: RequestResponseMetadata,
82 audio_duration_s: float,
83 separator: str,
84 ) -> AsyncGenerator[str, None]:
85 generator = self._speech_to_text_stream_generator(
86 request=request,
87 list_result_generator=result_generator,
88 request_id=request_id,
89 request_metadata=request_metadata,
90 audio_duration_s=audio_duration_s,
91 chunk_object_type="translation.chunk",
92 response_stream_choice_class=TranslationResponseStreamChoice,
93 stream_response_class=TranslationStreamResponse,
94 separator=separator,
95 )
96 async for chunk in generator:
97 yield chunk