main
py 120 lines 4.44 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 from http import HTTPStatus
4
5 from fastapi import APIRouter, Depends, Request
6 from fastapi.responses import JSONResponse
7
8 from vllm.entrypoints.anthropic.protocol import AnthropicMessagesRequest
9 from vllm.entrypoints.openai.chat_completion.protocol import ChatCompletionRequest
10 from vllm.entrypoints.openai.completion.protocol import CompletionRequest
11 from vllm.entrypoints.openai.responses.protocol import ResponsesRequest
12 from vllm.entrypoints.serve.engine.protocol import ErrorResponse
13 from vllm.entrypoints.serve.utils.api_utils import validate_json_request
14 from vllm.logger import init_logger
15
16 from ..token_in_token_out.protocol import GenerateRequest
17 from .serving import ServingRender
18
19 logger = init_logger(__name__)
20
21 router = APIRouter()
22
23
24 def render(request: Request) -> ServingRender | None:
25 return getattr(request.app.state, "serving_render", None)
26
27
28 @router.post(
29 "/v1/chat/completions/render",
30 dependencies=[Depends(validate_json_request)],
31 response_model=GenerateRequest,
32 responses={
33 HTTPStatus.BAD_REQUEST.value: {"model": ErrorResponse},
34 HTTPStatus.NOT_FOUND.value: {"model": ErrorResponse},
35 HTTPStatus.NOT_IMPLEMENTED.value: {"model": ErrorResponse},
36 HTTPStatus.INTERNAL_SERVER_ERROR.value: {"model": ErrorResponse},
37 },
38 )
39 async def render_chat_completion(request: ChatCompletionRequest, raw_request: Request):
40 handler = render(raw_request)
41 if handler is None:
42 raise NotImplementedError(
43 "The model does not support Chat Completions Render API"
44 )
45
46 result = await handler.render_chat_request(request)
47
48 if isinstance(result, ErrorResponse):
49 return JSONResponse(content=result.model_dump(), status_code=result.error.code)
50
51 return JSONResponse(content=result.model_dump())
52
53
54 @router.post(
55 "/v1/messages/render",
56 dependencies=[Depends(validate_json_request)],
57 response_model=GenerateRequest,
58 responses={
59 HTTPStatus.BAD_REQUEST.value: {"model": ErrorResponse},
60 HTTPStatus.NOT_FOUND.value: {"model": ErrorResponse},
61 HTTPStatus.NOT_IMPLEMENTED.value: {"model": ErrorResponse},
62 HTTPStatus.INTERNAL_SERVER_ERROR.value: {"model": ErrorResponse},
63 },
64 )
65 async def render_messages(request: AnthropicMessagesRequest, raw_request: Request):
66 handler = render(raw_request)
67 if handler is None:
68 raise NotImplementedError("The model does not support Messages Render API")
69
70 result = await handler.render_messages_request(request)
71
72 if isinstance(result, ErrorResponse):
73 return JSONResponse(content=result.model_dump(), status_code=result.error.code)
74
75 return JSONResponse(content=result.model_dump())
76
77
78 @router.post(
79 "/v1/completions/render",
80 dependencies=[Depends(validate_json_request)],
81 response_model=list[GenerateRequest],
82 responses={
83 HTTPStatus.BAD_REQUEST.value: {"model": ErrorResponse},
84 HTTPStatus.NOT_FOUND.value: {"model": ErrorResponse},
85 HTTPStatus.INTERNAL_SERVER_ERROR.value: {"model": ErrorResponse},
86 },
87 )
88 async def render_completion(request: CompletionRequest, raw_request: Request):
89 handler = render(raw_request)
90 if handler is None:
91 raise NotImplementedError("The model does not support Completions Render API")
92
93 result = await handler.render_completion_request(request)
94
95 if isinstance(result, ErrorResponse):
96 return JSONResponse(content=result.model_dump(), status_code=result.error.code)
97
98 return JSONResponse(content=[item.model_dump() for item in result])
99
100
101 @router.post(
102 "/v1/responses/render",
103 dependencies=[Depends(validate_json_request)],
104 response_model=GenerateRequest,
105 responses={
106 HTTPStatus.BAD_REQUEST.value: {"model": ErrorResponse},
107 HTTPStatus.NOT_FOUND.value: {"model": ErrorResponse},
108 HTTPStatus.NOT_IMPLEMENTED.value: {"model": ErrorResponse},
109 HTTPStatus.INTERNAL_SERVER_ERROR.value: {"model": ErrorResponse},
110 },
111 )
112 async def render_responses(request: ResponsesRequest, raw_request: Request):
113 handler = render(raw_request)
114 if handler is None:
115 raise NotImplementedError("The model does not support Responses Render API")
116
117 result = await handler.render_responses_request(request)
118 if isinstance(result, ErrorResponse):
119 return JSONResponse(content=result.model_dump(), status_code=result.error.code)
120 return JSONResponse(content=result.model_dump())