Skip to content

Commit 50afed4

Browse files
authored
Support extra field regex in OpenAI API (#172)
1 parent 4d303c4 commit 50afed4

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

python/sglang/srt/managers/openai_protocol.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ class CompletionRequest(BaseModel):
3636
logit_bias: Optional[Dict[str, float]] = None
3737
user: Optional[str] = None
3838

39+
# Extra parameters for SRT backend only and will be ignored by OpenAI models.
40+
regex: Optional[str] = None
41+
3942

4043
class CompletionResponseChoice(BaseModel):
4144
index: int
@@ -119,6 +122,9 @@ class ChatCompletionRequest(BaseModel):
119122
user: Optional[str] = None
120123
best_of: Optional[int] = None
121124

125+
# Extra parameters for SRT backend only and will be ignored by OpenAI models.
126+
regex: Optional[str] = None
127+
122128

123129
class ChatMessage(BaseModel):
124130
role: Optional[str] = None

python/sglang/srt/server.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ async def v1_completions(raw_request: Request):
151151
"top_p": request.top_p,
152152
"presence_penalty": request.presence_penalty,
153153
"frequency_penalty": request.frequency_penalty,
154+
"regex": request.regex,
154155
},
155156
return_logprob=request.logprobs is not None,
156157
stream=request.stream,
@@ -304,6 +305,7 @@ async def v1_chat_completions(raw_request: Request):
304305
"top_p": request.top_p,
305306
"presence_penalty": request.presence_penalty,
306307
"frequency_penalty": request.frequency_penalty,
308+
"regex": request.regex,
307309
},
308310
stream=request.stream,
309311
)

test/srt/test_openai_server.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"""
1515

1616
import argparse
17+
import json
1718

1819
import openai
1920

@@ -151,6 +152,29 @@ def test_chat_completion_stream(args):
151152
print()
152153

153154

155+
def test_regex(args):
156+
client = openai.Client(api_key="EMPTY", base_url=args.base_url)
157+
158+
regex = (r"""\{\n"""
159+
+ r""" "name": "[\w]+",\n"""
160+
+ r""" "population": "[\w\d\s]+"\n"""
161+
+ r"""\}"""
162+
)
163+
164+
response = client.chat.completions.create(
165+
model="default",
166+
messages=[
167+
{"role": "system", "content": "You are a helpful AI assistant"},
168+
{"role": "user", "content": "Introduce the capital of France."},
169+
],
170+
temperature=0,
171+
max_tokens=128,
172+
extra_body={"regex": regex},
173+
)
174+
text = response.choices[0].message.content
175+
print(json.loads(text))
176+
177+
154178
if __name__ == "__main__":
155179
parser = argparse.ArgumentParser()
156180
parser.add_argument("--base-url", type=str, default="http://127.0.0.1:30000/v1")
@@ -169,5 +193,6 @@ def test_chat_completion_stream(args):
169193
test_completion_stream(args, echo=True, logprobs=True)
170194
test_chat_completion(args)
171195
test_chat_completion_stream(args)
196+
test_regex(args)
172197
if args.test_image:
173198
test_chat_completion_image(args)

0 commit comments

Comments
 (0)