e93507a09c
Lockfile supply-chain audit / lockfile supply-chain audit (push) Has been cancelled
Windows Studio GGUF CI / GPU prebuilt resolves without Visual Studio (push) Has been cancelled
Windows Studio GGUF CI / setup.ps1 unit tests (VS 2026 / CMake guard) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2022) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-2025-vs2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-latest) (push) Has been cancelled
Windows Studio Update CI / Studio Updating Tests (push) Has been cancelled
Wheel CI / Wheel build + content sanity + import smoke (push) Has been cancelled
Lint CI / Source lint (Python + shell + YAML + JSON + safety nets) (push) Has been cancelled
MLX CI on Mac M1 / dispatch (push) Has been cancelled
Security audit / advisory audit (pip + npm + cargo) (push) Has been cancelled
Security audit / pip scan-packages :: extras (push) Has been cancelled
Security audit / pip scan-packages :: studio (push) Has been cancelled
Security audit / pip scan-packages :: hf-stack (push) Has been cancelled
Security audit / npm scan-packages (Studio frontend tarballs) (push) Has been cancelled
Security audit / workflow-trigger lint (pull_request_target / cache-poisoning) (push) Has been cancelled
Security audit / pytest tests/security (push) Has been cancelled
Security audit / npm provenance + new install-script diff (push) Has been cancelled
Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Backend CI / (Python 3.10) (push) Has been cancelled
Backend CI / (Python 3.11) (push) Has been cancelled
Backend CI / (Python 3.12) (push) Has been cancelled
Backend CI / (Python 3.13) (push) Has been cancelled
Backend CI / Repo tests (CPU) (push) Has been cancelled
Frontend CI / Frontend build + bundle sanity (push) Has been cancelled
Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Mac Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Mac Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-14) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15-intel) (push) Has been cancelled
Mac Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26-intel) (push) Has been cancelled
Mac Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Tauri CI / Tauri Linux debug build (no codesign) (push) Has been cancelled
Mac Studio Update CI / Studio Updating Tests (push) Has been cancelled
Studio UI CI / Chat UI Tests (push) Has been cancelled
Windows Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Windows Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Update CI / Studio Updating Tests (push) Has been cancelled
Core / Core (HF=default + TRL=default) (push) Has been cancelled
Core / Core (HF=4.57.6 + TRL<1) (push) Has been cancelled
Core / Core (HF=latest + TRL=latest) (push) Has been cancelled
Core / llama.cpp build + smoke (push) Has been cancelled
Windows Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Windows Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Windows Studio GGUF CI / JSON, images (push) Has been cancelled
Windows Studio GGUF CI / Studio install + inference without Visual Studio (push) Has been cancelled
Studio export capability / capability (macos-latest) (push) Has been cancelled
Studio export capability / capability (ubuntu-latest) (push) Has been cancelled
Studio export capability / capability (windows-latest) (push) Has been cancelled
Cross-platform parity / parity (macos-latest) (push) Has been cancelled
Cross-platform parity / parity (windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Studio load-orchestrator CI / test (push) Has been cancelled
96 lines
3.5 KiB
Python
96 lines
3.5 KiB
Python
"""GPU-free test for the fast_generate slow-mode guard in _utils.py.
|
|
|
|
When fast_inference=False, model.fast_generate falls back to HuggingFace generate, so vLLM-only
|
|
inputs must be rejected with a clear message instead of leaking into transformers.generate. Covers
|
|
a string prompt, a vLLM {"prompt":..., "multi_modal_data":...} dict, SamplingParams passed both
|
|
positionally and as a kwarg, and a normal tokenized call passing through.
|
|
"""
|
|
|
|
import ast, functools, os
|
|
|
|
HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
UTILS = os.path.join(HERE, "unsloth", "models", "_utils.py")
|
|
|
|
|
|
def _load_factory():
|
|
src = open(UTILS).read()
|
|
for node in ast.parse(src).body:
|
|
if isinstance(node, ast.FunctionDef) and node.name == "make_fast_generate_wrapper":
|
|
ns = {"functools": functools}
|
|
exec(ast.get_source_segment(src, node), ns)
|
|
return ns["make_fast_generate_wrapper"]
|
|
raise AssertionError("make_fast_generate_wrapper not found in _utils.py")
|
|
|
|
|
|
make_fast_generate_wrapper = _load_factory()
|
|
|
|
|
|
class _SamplingParams:
|
|
pass
|
|
|
|
|
|
_SamplingParams.__name__ = "SamplingParams" # match by class name, no vllm import needed
|
|
|
|
|
|
def _wrapper():
|
|
state = {}
|
|
|
|
def original_generate(*a, **k):
|
|
state["hit"] = True
|
|
return "ok"
|
|
|
|
return make_fast_generate_wrapper(original_generate), state
|
|
|
|
|
|
def _rejects(fn, needle):
|
|
try:
|
|
fn()
|
|
except ValueError as e:
|
|
assert needle in str(e), str(e)
|
|
return True
|
|
raise AssertionError("expected ValueError")
|
|
|
|
|
|
def test_fast_generate_slow_guard():
|
|
w, _ = _wrapper()
|
|
# reject every vLLM-only shape
|
|
assert _rejects(lambda: w("hello"), "fast_inference=True")
|
|
assert _rejects(
|
|
lambda: w({"prompt": "hi", "multi_modal_data": {"image": None}}), "fast_inference=True"
|
|
)
|
|
assert _rejects(lambda: w(["a", "b"]), "fast_inference=True")
|
|
assert _rejects(lambda: w([{"prompt": "hi"}]), "fast_inference=True") # list of prompt dicts
|
|
assert _rejects(
|
|
lambda: w({"prompt_token_ids": [1, 2, 3]}), "fast_inference=True"
|
|
) # vLLM TokensPrompt
|
|
assert _rejects(lambda: w(prompts = "hello"), "fast_inference=True") # vLLM `prompts` kwarg
|
|
assert _rejects(
|
|
lambda: w(prompts = [{"prompt": "hi"}]), "fast_inference=True"
|
|
) # vLLM `prompts` kwarg list
|
|
assert _rejects(
|
|
lambda: w(prompt_token_ids = [1, 2, 3]), "fast_inference=True"
|
|
) # vLLM legacy tokenized kwarg
|
|
assert _rejects(
|
|
lambda: w(prompts = [1, 2, 3]), "fast_inference=True"
|
|
) # token-id list via vLLM-only `prompts` kwarg
|
|
assert _rejects(
|
|
lambda: w(prompts = None), "fast_inference=True"
|
|
) # vLLM-only kwarg present even if None
|
|
assert _rejects(lambda: w({"prompt": "hi"}, _SamplingParams()), "sampling_params")
|
|
assert _rejects(
|
|
lambda: w({"prompt": "hi"}, [_SamplingParams()]), "sampling_params"
|
|
) # list of SamplingParams
|
|
assert _rejects(lambda: w(sampling_params = object()), "sampling_params")
|
|
|
|
# pass normal tokenized calls with no false positives
|
|
w, state = _wrapper()
|
|
assert w(input_ids = "TOKENS", max_new_tokens = 8) == "ok" and state.get("hit")
|
|
assert w([1, 2, 3], max_new_tokens = 8) == "ok" # positional token ids
|
|
assert w([], max_new_tokens = 8) == "ok" # empty positional
|
|
print("13 reject + 3 pass fast_generate slow-mode guard cases passed")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
test_fast_generate_slow_guard()
|
|
print("OK: fast_generate rejects vLLM-style inputs when fast_inference=False")
|