@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / d00ce29d89
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 14, 05:30 UTC

[CI] Reorganize entrypoints tests (#27403)

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>

Chauncey committed Oct 23, 2025 at 18:10 UTC d00ce29d89c7badf5fb6ca511cc591fd9c62a85f
2 files changed +141 -139
tests/entrypoints/openai/test_chat.py
-139
@@ -599,145 +599,6 @@ async def test_structured_outputs_choice_chat_logprobs(
599 assert item.logprob >= -9999.0, f"Failed (top_logprobs={top_logprobs})"
600
601
602 -@pytest.mark.asyncio
603 -async def test_named_tool_use(
604 - client: openai.AsyncOpenAI,
605 - sample_json_schema,
606 -):
607 - messages = [
608 - {"role": "system", "content": "you are a helpful assistant"},
609 - {
610 - "role": "user",
611 - "content": (
612 - "Give an example JSON for an employee profile using the specified tool."
613 - ),
614 - },
615 - ]
616 - tools = [
617 - {
618 - "type": "function",
619 - "function": {
620 - "name": "dummy_function_name",
621 - "description": "This is a dummy function",
622 - "parameters": sample_json_schema,
623 - },
624 - }
625 - ]
626 - tool_choice = {"type": "function", "function": {"name": "dummy_function_name"}}
627 -
628 - # non-streaming
629 -
630 - chat_completion = await client.chat.completions.create(
631 - model=MODEL_NAME,
632 - messages=messages,
633 - max_completion_tokens=1000,
634 - tools=tools,
635 - tool_choice=tool_choice,
636 - )
637 - message = chat_completion.choices[0].message
638 - assert len(message.content) == 0
639 - json_string = message.tool_calls[0].function.arguments
640 - json1 = json.loads(json_string)
641 - jsonschema.validate(instance=json1, schema=sample_json_schema)
642 -
643 - messages.append({"role": "assistant", "content": json_string})
644 - messages.append(
645 - {"role": "user", "content": "Give me another one with a different name and age"}
646 - )
647 -
648 - # streaming
649 -
650 - stream = await client.chat.completions.create(
651 - model=MODEL_NAME,
652 - messages=messages,
653 - max_completion_tokens=1000,
654 - tools=tools,
655 - tool_choice=tool_choice,
656 - stream=True,
657 - )
658 -
659 - output = []
660 - finish_reason_count = 0
661 - async for chunk in stream:
662 - delta = chunk.choices[0].delta
663 - if delta.role:
664 - assert delta.role == "assistant"
665 - assert delta.content is None or len(delta.content) == 0
666 - if delta.tool_calls:
667 - output.append(delta.tool_calls[0].function.arguments)
668 - if chunk.choices[0].finish_reason is not None:
669 - finish_reason_count += 1
670 - # finish reason should only return in last block
671 - assert finish_reason_count == 1
672 - json2 = json.loads("".join(output))
673 - jsonschema.validate(instance=json2, schema=sample_json_schema)
674 - assert json1["name"] != json2["name"]
675 - assert json1["age"] != json2["age"]
676 -
677 -
678 -@pytest.mark.asyncio
679 -async def test_inconsistent_tool_choice_and_tools(
680 - client: openai.AsyncOpenAI, sample_json_schema
681 -):
682 - messages = [
683 - {"role": "system", "content": "you are a helpful assistant"},
684 - {
685 - "role": "user",
686 - "content": f"Give an example JSON for an employee profile that "
687 - f"fits this schema: {sample_json_schema}",
688 - },
689 - ]
690 -
691 - with pytest.raises(openai.BadRequestError):
692 - await client.chat.completions.create(
693 - model=MODEL_NAME,
694 - messages=messages,
695 - max_completion_tokens=1000,
696 - tool_choice={
697 - "type": "function",
698 - "function": {"name": "dummy_function_name"},
699 - },
700 - )
701 -
702 - with pytest.raises(openai.BadRequestError):
703 - await client.chat.completions.create(
704 - model=MODEL_NAME,
705 - messages=messages,
706 - max_completion_tokens=1000,
707 - tools=[
708 - {
709 - "type": "function",
710 - "function": {
711 - "name": "dummy_function_name",
712 - "description": "This is a dummy function",
713 - "parameters": sample_json_schema,
714 - },
715 - }
716 - ],
717 - tool_choice={
718 - "type": "function",
719 - "function": {"name": "nondefined_function_name"},
720 - },
721 - )
722 - with pytest.raises(openai.BadRequestError):
723 - await client.chat.completions.create(
724 - model=MODEL_NAME,
725 - messages=messages,
726 - max_completion_tokens=1000,
727 - tools=[
728 - {
729 - "type": "function",
730 - "function": {
731 - "name": "dummy_function_name",
732 - "description": "This is a dummy function",
733 - "parameters": sample_json_schema,
734 - },
735 - }
736 - ],
737 - tool_choice={},
738 - )
739 -
740 -
602 @pytest.mark.asyncio
603 async def test_response_format_json_object(client: openai.AsyncOpenAI):
604 for _ in range(2):
tests/entrypoints/openai/test_completion_with_function_calling.py
+141
@@ -2,7 +2,9 @@
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 import datetime
5 +import json
6
7 +import jsonschema
8 import openai # use the official client for correctness check
9 import pytest
10 import pytest_asyncio
@@ -341,3 +343,142 @@ async def test_no_args_tool_call(
343 else:
344 # No tool called — just print model's direct reply
345 assert message.content is not None
346 +
347 +
348 +@pytest.mark.asyncio
349 +async def test_named_tool_use(
350 + client: openai.AsyncOpenAI,
351 + sample_json_schema,
352 +):
353 + messages = [
354 + {"role": "system", "content": "you are a helpful assistant"},
355 + {
356 + "role": "user",
357 + "content": (
358 + "Give an example JSON for an employee profile using the specified tool."
359 + ),
360 + },
361 + ]
362 + tools = [
363 + {
364 + "type": "function",
365 + "function": {
366 + "name": "dummy_function_name",
367 + "description": "This is a dummy function",
368 + "parameters": sample_json_schema,
369 + },
370 + }
371 + ]
372 + tool_choice = {"type": "function", "function": {"name": "dummy_function_name"}}
373 +
374 + # non-streaming
375 +
376 + chat_completion = await client.chat.completions.create(
377 + model=MODEL_NAME,
378 + messages=messages,
379 + max_completion_tokens=1000,
380 + tools=tools,
381 + tool_choice=tool_choice,
382 + )
383 + message = chat_completion.choices[0].message
384 + assert len(message.content) == 0
385 + json_string = message.tool_calls[0].function.arguments
386 + json1 = json.loads(json_string)
387 + jsonschema.validate(instance=json1, schema=sample_json_schema)
388 +
389 + messages.append({"role": "assistant", "content": json_string})
390 + messages.append(
391 + {"role": "user", "content": "Give me another one with a different name and age"}
392 + )
393 +
394 + # streaming
395 +
396 + stream = await client.chat.completions.create(
397 + model=MODEL_NAME,
398 + messages=messages,
399 + max_completion_tokens=1000,
400 + tools=tools,
401 + tool_choice=tool_choice,
402 + stream=True,
403 + )
404 +
405 + output = []
406 + finish_reason_count = 0
407 + async for chunk in stream:
408 + delta = chunk.choices[0].delta
409 + if delta.role:
410 + assert delta.role == "assistant"
411 + assert delta.content is None or len(delta.content) == 0
412 + if delta.tool_calls:
413 + output.append(delta.tool_calls[0].function.arguments)
414 + if chunk.choices[0].finish_reason is not None:
415 + finish_reason_count += 1
416 + # finish reason should only return in last block
417 + assert finish_reason_count == 1
418 + json2 = json.loads("".join(output))
419 + jsonschema.validate(instance=json2, schema=sample_json_schema)
420 + assert json1["name"] != json2["name"]
421 + assert json1["age"] != json2["age"]
422 +
423 +
424 +@pytest.mark.asyncio
425 +async def test_inconsistent_tool_choice_and_tools(
426 + client: openai.AsyncOpenAI, sample_json_schema
427 +):
428 + messages = [
429 + {"role": "system", "content": "you are a helpful assistant"},
430 + {
431 + "role": "user",
432 + "content": f"Give an example JSON for an employee profile that "
433 + f"fits this schema: {sample_json_schema}",
434 + },
435 + ]
436 +
437 + with pytest.raises(openai.BadRequestError):
438 + await client.chat.completions.create(
439 + model=MODEL_NAME,
440 + messages=messages,
441 + max_completion_tokens=1000,
442 + tool_choice={
443 + "type": "function",
444 + "function": {"name": "dummy_function_name"},
445 + },
446 + )
447 +
448 + with pytest.raises(openai.BadRequestError):
449 + await client.chat.completions.create(
450 + model=MODEL_NAME,
451 + messages=messages,
452 + max_completion_tokens=1000,
453 + tools=[
454 + {
455 + "type": "function",
456 + "function": {
457 + "name": "dummy_function_name",
458 + "description": "This is a dummy function",
459 + "parameters": sample_json_schema,
460 + },
461 + }
462 + ],
463 + tool_choice={
464 + "type": "function",
465 + "function": {"name": "nondefined_function_name"},
466 + },
467 + )
468 + with pytest.raises(openai.BadRequestError):
469 + await client.chat.completions.create(
470 + model=MODEL_NAME,
471 + messages=messages,
472 + max_completion_tokens=1000,
473 + tools=[
474 + {
475 + "type": "function",
476 + "function": {
477 + "name": "dummy_function_name",
478 + "description": "This is a dummy function",
479 + "parameters": sample_json_schema,
480 + },
481 + }
482 + ],
483 + tool_choice={},
484 + )