mirror of
https://git.datalinker.icu/vllm-project/vllm.git
synced 2026-05-16 23:35:44 +08:00
Add backward compatibility for guided_... API (#25615)
Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com> Signed-off-by: Cyrus Leung <cyrus.tl.leung@gmail.com> Co-authored-by: Cyrus Leung <cyrus.tl.leung@gmail.com> Signed-off-by: yewentao256 <zhyanwentao@126.com>
This commit is contained in:
parent
f3d9099b44
commit
22114ffebb
@ -6,6 +6,17 @@ vLLM supports the generation of structured outputs using
|
|||||||
This document shows you some examples of the different options that are
|
This document shows you some examples of the different options that are
|
||||||
available to generate structured outputs.
|
available to generate structured outputs.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
If you are still using the following deprecated API fields, please update your code to use `structured_outputs` as demonstrated in the rest of this document:
|
||||||
|
|
||||||
|
- `guided_json` -> `{"structured_outputs": {"json": ...}}` or `StructuredOutputsParams(json=...)`
|
||||||
|
- `guided_regex` -> `{"structured_outputs": {"regex": ...}}` or `StructuredOutputsParams(regex=...)`
|
||||||
|
- `guided_choice` -> `{"structured_outputs": {"choice": ...}}` or `StructuredOutputsParams(choice=...)`
|
||||||
|
- `guided_grammar` -> `{"structured_outputs": {"grammar": ...}}` or `StructuredOutputsParams(grammar=...)`
|
||||||
|
- `guided_whitespace_pattern` -> `{"structured_outputs": {"whitespace_pattern": ...}}` or `StructuredOutputsParams(whitespace_pattern=...)`
|
||||||
|
- `structural_tag` -> `{"structured_outputs": {"structural_tag": ...}}` or `StructuredOutputsParams(structural_tag=...)`
|
||||||
|
- `guided_decoding_backend` -> Remove this field from your request
|
||||||
|
|
||||||
## Online Serving (OpenAI API)
|
## Online Serving (OpenAI API)
|
||||||
|
|
||||||
You can generate structured outputs using the OpenAI's [Completions](https://platform.openai.com/docs/api-reference/completions) and [Chat](https://platform.openai.com/docs/api-reference/chat) API.
|
You can generate structured outputs using the OpenAI's [Completions](https://platform.openai.com/docs/api-reference/completions) and [Chat](https://platform.openai.com/docs/api-reference/chat) API.
|
||||||
|
|||||||
@ -541,6 +541,56 @@ class ChatCompletionRequest(OpenAIBaseModel):
|
|||||||
default=None,
|
default=None,
|
||||||
description="Additional kwargs for structured outputs",
|
description="Additional kwargs for structured outputs",
|
||||||
)
|
)
|
||||||
|
guided_json: Optional[Union[str, dict, BaseModel]] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_json` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `json` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
guided_regex: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_regex` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `regex` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
guided_choice: Optional[list[str]] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_choice` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `choice` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
guided_grammar: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_grammar` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `grammar` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
structural_tag: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`structural_tag` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `structural_tag` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
guided_decoding_backend: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_decoding_backend` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please remove it from your request."),
|
||||||
|
)
|
||||||
|
guided_whitespace_pattern: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_whitespace_pattern` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `whitespace_pattern` to `structured_outputs` instead."
|
||||||
|
),
|
||||||
|
)
|
||||||
priority: int = Field(
|
priority: int = Field(
|
||||||
default=0,
|
default=0,
|
||||||
description=(
|
description=(
|
||||||
@ -658,6 +708,20 @@ class ChatCompletionRequest(OpenAIBaseModel):
|
|||||||
if prompt_logprobs is None and self.echo:
|
if prompt_logprobs is None and self.echo:
|
||||||
prompt_logprobs = self.top_logprobs
|
prompt_logprobs = self.top_logprobs
|
||||||
|
|
||||||
|
# Forward deprecated guided_* parameters to structured_outputs
|
||||||
|
if self.structured_outputs is None:
|
||||||
|
kwargs = dict[str, Any](
|
||||||
|
json=self.guided_json,
|
||||||
|
regex=self.guided_regex,
|
||||||
|
choice=self.guided_choice,
|
||||||
|
grammar=self.guided_grammar,
|
||||||
|
whitespace_pattern=self.guided_whitespace_pattern,
|
||||||
|
structural_tag=self.structural_tag,
|
||||||
|
)
|
||||||
|
kwargs = {k: v for k, v in kwargs.items() if v is not None}
|
||||||
|
if len(kwargs) > 0:
|
||||||
|
self.structured_outputs = StructuredOutputsParams(**kwargs)
|
||||||
|
|
||||||
response_format = self.response_format
|
response_format = self.response_format
|
||||||
json_schema_from_tool = self._get_json_schema_from_tool()
|
json_schema_from_tool = self._get_json_schema_from_tool()
|
||||||
if response_format is not None or json_schema_from_tool is not None:
|
if response_format is not None or json_schema_from_tool is not None:
|
||||||
@ -839,7 +903,7 @@ class ChatCompletionRequest(OpenAIBaseModel):
|
|||||||
if isinstance(data, ValueError):
|
if isinstance(data, ValueError):
|
||||||
raise data
|
raise data
|
||||||
|
|
||||||
if "structured_outputs" not in data:
|
if data.get("structured_outputs", None) is None:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
structured_outputs_kwargs = data['structured_outputs']
|
structured_outputs_kwargs = data['structured_outputs']
|
||||||
@ -1016,6 +1080,49 @@ class CompletionRequest(OpenAIBaseModel):
|
|||||||
default=None,
|
default=None,
|
||||||
description="Additional kwargs for structured outputs",
|
description="Additional kwargs for structured outputs",
|
||||||
)
|
)
|
||||||
|
guided_json: Optional[Union[str, dict, BaseModel]] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_json` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `json` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
guided_regex: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_regex` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `regex` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
guided_choice: Optional[list[str]] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_choice` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `choice` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
guided_grammar: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_grammar` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `grammar` to `structured_outputs` instead."),
|
||||||
|
)
|
||||||
|
guided_decoding_backend: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_decoding_backend` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please remove it from your request."),
|
||||||
|
)
|
||||||
|
guided_whitespace_pattern: Optional[str] = Field(
|
||||||
|
default=None,
|
||||||
|
description=(
|
||||||
|
"`guided_whitespace_pattern` is deprecated. "
|
||||||
|
"This will be removed in v0.12.0 or v1.0.0, whichever is soonest. "
|
||||||
|
"Please pass `whitespace_pattern` to `structured_outputs` instead."
|
||||||
|
),
|
||||||
|
)
|
||||||
priority: int = Field(
|
priority: int = Field(
|
||||||
default=0,
|
default=0,
|
||||||
description=(
|
description=(
|
||||||
@ -1145,6 +1252,19 @@ class CompletionRequest(OpenAIBaseModel):
|
|||||||
|
|
||||||
echo_without_generation = self.echo and self.max_tokens == 0
|
echo_without_generation = self.echo and self.max_tokens == 0
|
||||||
|
|
||||||
|
# Forward deprecated guided_* parameters to structured_outputs
|
||||||
|
if self.structured_outputs is None:
|
||||||
|
kwargs = dict[str, Any](
|
||||||
|
json=self.guided_json,
|
||||||
|
regex=self.guided_regex,
|
||||||
|
choice=self.guided_choice,
|
||||||
|
grammar=self.guided_grammar,
|
||||||
|
whitespace_pattern=self.guided_whitespace_pattern,
|
||||||
|
)
|
||||||
|
kwargs = {k: v for k, v in kwargs.items() if v is not None}
|
||||||
|
if len(kwargs) > 0:
|
||||||
|
self.structured_outputs = StructuredOutputsParams(**kwargs)
|
||||||
|
|
||||||
if (self.structured_outputs is not None
|
if (self.structured_outputs is not None
|
||||||
and self.response_format is not None
|
and self.response_format is not None
|
||||||
and self.response_format.type == "json_object"):
|
and self.response_format.type == "json_object"):
|
||||||
@ -1189,7 +1309,7 @@ class CompletionRequest(OpenAIBaseModel):
|
|||||||
@model_validator(mode="before")
|
@model_validator(mode="before")
|
||||||
@classmethod
|
@classmethod
|
||||||
def check_structured_outputs_count(cls, data):
|
def check_structured_outputs_count(cls, data):
|
||||||
if "structured_outputs" not in data:
|
if data.get("structured_outputs", None) is None:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
structured_outputs_kwargs = data['structured_outputs']
|
structured_outputs_kwargs = data['structured_outputs']
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user