main
py 222 lines 9.04 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 from typing import TYPE_CHECKING, Any
4
5 from fastapi import FastAPI
6
7 import vllm.envs as envs
8
9 if TYPE_CHECKING:
10 from argparse import Namespace
11
12 from starlette.datastructures import State
13
14 from vllm.engine.protocol import EngineClient
15 from vllm.entrypoints.serve.utils.request_logger import RequestLogger
16 from vllm.tasks import SupportedTask
17 else:
18 RequestLogger = object
19
20
21 def register_generate_api_routers(app: FastAPI):
22 from vllm.entrypoints.openai.chat_completion.api_router import (
23 attach_router as register_chat_api_router,
24 )
25
26 register_chat_api_router(app)
27
28 from vllm.entrypoints.openai.responses.api_router import (
29 attach_router as register_responses_api_router,
30 )
31
32 register_responses_api_router(app)
33
34 from vllm.entrypoints.openai.completion.api_router import (
35 attach_router as register_completion_api_router,
36 )
37
38 register_completion_api_router(app)
39
40 from vllm.entrypoints.anthropic.api_router import (
41 attach_router as register_anthropic_api_router,
42 )
43
44 register_anthropic_api_router(app)
45
46 from vllm.entrypoints.cohere.api_router import (
47 attach_router as register_cohere_api_router,
48 )
49
50 register_cohere_api_router(app)
51
52 from .generative_scoring.api_router import register_generative_scoring_api_router
53
54 register_generative_scoring_api_router(app)
55
56
57 async def init_generate_state(
58 engine_client: "EngineClient",
59 state: "State",
60 args: "Namespace",
61 request_logger: RequestLogger | None,
62 supported_tasks: tuple["SupportedTask", ...],
63 default_chat_template_kwargs: dict[str, Any],
64 ):
65 from vllm.entrypoints.anthropic.serving import AnthropicServingMessages
66 from vllm.entrypoints.chat_utils import load_chat_template
67
68 # The Cohere serving handler depends on the optional `cohere` SDK for
69 # its wire-format protocol models, and is additionally gated on the
70 # `VLLM_ENABLE_COHERE_API` env flag (see
71 # `vllm.entrypoints.cohere.api_router.attach_router`). Skip the import
72 # entirely when the endpoint isn't going to be exposed, both because
73 # the SDK may not be installed and because the serving object holds
74 # nontrivial state (chat handler, warmup) that would otherwise be
75 # unused.
76 if envs.VLLM_ENABLE_COHERE_API:
77 try:
78 from vllm.entrypoints.cohere.serving import CohereServingChatV2
79 except ImportError:
80 CohereServingChatV2 = None # type: ignore[assignment,misc]
81 else:
82 CohereServingChatV2 = None # type: ignore[assignment,misc]
83 from vllm.entrypoints.openai.chat_completion.batch_serving import (
84 OpenAIServingChatBatch,
85 )
86 from vllm.entrypoints.openai.chat_completion.serving import OpenAIServingChat
87 from vllm.entrypoints.openai.completion.serving import OpenAIServingCompletion
88 from vllm.entrypoints.openai.responses.serving import OpenAIServingResponses
89 from vllm.entrypoints.serve.utils.fingerprint import set_default_fingerprint_mode
90
91 # Applied before any serving class is constructed so that each one picks
92 # up the chosen mode on its first cache miss.
93 set_default_fingerprint_mode(
94 getattr(args, "fingerprint_mode", "full"),
95 getattr(args, "fingerprint_value", None),
96 )
97
98 resolved_chat_template = load_chat_template(args.chat_template)
99
100 # Render endpoints are always backed by OnlineRenderer so that chat,
101 # completion, and Responses rendering work on both generate-mode and
102 # render-only servers. Created in init_app_state.
103
104 state.openai_serving_responses = (
105 OpenAIServingResponses(
106 engine_client,
107 state.openai_serving_models,
108 state.online_renderer,
109 request_logger=request_logger,
110 chat_template=resolved_chat_template,
111 chat_template_content_format=args.chat_template_content_format,
112 return_tokens_as_token_ids=args.return_tokens_as_token_ids,
113 enable_auto_tools=args.enable_auto_tool_choice,
114 tool_parser=args.tool_call_parser,
115 tool_strict_level=args.tool_strict_level,
116 tool_server=state.tool_server,
117 reasoning_parser=args.structured_outputs_config.reasoning_parser,
118 enable_prompt_tokens_details=args.enable_prompt_tokens_details,
119 enable_force_include_usage=args.enable_force_include_usage,
120 enable_per_request_metrics=args.enable_per_request_metrics,
121 enable_log_outputs=args.enable_log_outputs,
122 default_chat_template_kwargs=default_chat_template_kwargs,
123 )
124 if "generate" in supported_tasks
125 else None
126 )
127 _chat_kwargs = dict(
128 engine_client=engine_client,
129 models=state.openai_serving_models,
130 response_role=args.response_role,
131 online_renderer=state.online_renderer,
132 request_logger=request_logger,
133 chat_template=resolved_chat_template,
134 chat_template_content_format=args.chat_template_content_format,
135 default_chat_template_kwargs=default_chat_template_kwargs,
136 trust_request_chat_template=args.trust_request_chat_template,
137 return_tokens_as_token_ids=args.return_tokens_as_token_ids,
138 enable_auto_tools=args.enable_auto_tool_choice,
139 exclude_tools_when_tool_choice_none=args.exclude_tools_when_tool_choice_none,
140 tool_parser=args.tool_call_parser,
141 tool_strict_level=args.tool_strict_level,
142 reasoning_parser=args.structured_outputs_config.reasoning_parser,
143 enable_prompt_tokens_details=args.enable_prompt_tokens_details,
144 enable_force_include_usage=args.enable_force_include_usage,
145 enable_log_outputs=args.enable_log_outputs,
146 enable_log_deltas=args.enable_log_deltas,
147 enable_per_request_metrics=args.enable_per_request_metrics,
148 )
149 state.openai_serving_chat = (
150 OpenAIServingChat(**_chat_kwargs) if "generate" in supported_tasks else None
151 )
152 state.openai_serving_chat_batch = (
153 OpenAIServingChatBatch(**_chat_kwargs)
154 if "generate" in supported_tasks
155 else None
156 )
157 state.openai_serving_completion = (
158 OpenAIServingCompletion(
159 engine_client,
160 state.openai_serving_models,
161 online_renderer=state.online_renderer,
162 request_logger=request_logger,
163 return_tokens_as_token_ids=args.return_tokens_as_token_ids,
164 enable_prompt_tokens_details=args.enable_prompt_tokens_details,
165 enable_force_include_usage=args.enable_force_include_usage,
166 enable_per_request_metrics=args.enable_per_request_metrics,
167 )
168 if "generate" in supported_tasks
169 else None
170 )
171 state.anthropic_serving_messages = (
172 AnthropicServingMessages(
173 engine_client,
174 state.openai_serving_models,
175 args.response_role,
176 online_renderer=state.online_renderer,
177 request_logger=request_logger,
178 chat_template=resolved_chat_template,
179 chat_template_content_format=args.chat_template_content_format,
180 return_tokens_as_token_ids=args.return_tokens_as_token_ids,
181 enable_auto_tools=args.enable_auto_tool_choice,
182 tool_parser=args.tool_call_parser,
183 tool_strict_level=args.tool_strict_level,
184 reasoning_parser=args.structured_outputs_config.reasoning_parser,
185 enable_prompt_tokens_details=args.enable_prompt_tokens_details,
186 enable_force_include_usage=args.enable_force_include_usage,
187 default_chat_template_kwargs=default_chat_template_kwargs,
188 disabled_thinking_effort=args.anthropic_disabled_thinking_effort,
189 )
190 if "generate" in supported_tasks
191 else None
192 )
193 state.cohere_serving_chat_v2 = (
194 CohereServingChatV2(
195 engine_client,
196 state.openai_serving_models,
197 args.response_role,
198 online_renderer=state.online_renderer,
199 request_logger=request_logger,
200 chat_template=resolved_chat_template,
201 chat_template_content_format=args.chat_template_content_format,
202 return_tokens_as_token_ids=args.return_tokens_as_token_ids,
203 enable_auto_tools=args.enable_auto_tool_choice,
204 tool_parser=args.tool_call_parser,
205 tool_strict_level=args.tool_strict_level,
206 reasoning_parser=args.structured_outputs_config.reasoning_parser,
207 enable_prompt_tokens_details=args.enable_prompt_tokens_details,
208 enable_force_include_usage=args.enable_force_include_usage,
209 default_chat_template_kwargs=default_chat_template_kwargs,
210 is_reasoning_model=args.cohere_is_reasoning_model,
211 )
212 if CohereServingChatV2 is not None and "generate" in supported_tasks
213 else None
214 )
215
216 from .generative_scoring.serving import ServingGenerativeScoring
217
218 state.serving_generative_scoring = ServingGenerativeScoring(
219 engine_client,
220 state.openai_serving_models,
221 request_logger=request_logger,
222 )