Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
5175b88
[BugFix] Remove default multiproc executor `collective_rpc` timeout (…
njhill Apr 22, 2025
83d9337
[Core][V1][TPU] Enable structured decoding on TPU V1 (#16499)
Chenyaaang Apr 23, 2025
36fe787
[Bugfix] validate urls object for multimodal content parts (#16990)
gcalmettes Apr 23, 2025
f67e9e9
add Dockerfile build vllm against torch nightly (#16936)
yangw-dev Apr 23, 2025
bc7c4d2
[Kernel][ROCM] Upstream prefix prefill speed up for vLLM V1 (#13305)
maleksan85 Apr 23, 2025
1e013fa
[V1][DP] More robust DP/EP dummy request coordination (#16277)
njhill Apr 23, 2025
7e081ba
[BugFix] Revert ROCm Custom Paged Attention Env Flag Check (#17022)
vllmellm Apr 23, 2025
6bc1e30
Revert "[Misc] Add S3 environment variables for better support of Min…
chaunceyjiang Apr 23, 2025
e1cf90e
[misc] tune some env vars for GB200 (#16992)
youkaichao Apr 23, 2025
56a7352
[INTEL-HPU][v0] Port delayed sampling to upstream (#16949)
xuechendi Apr 23, 2025
eb8ef42
[doc] add download path tips (#17013)
reidliu41 Apr 23, 2025
047797e
[Bugfix] Triton FA function takes no keyword arguments (#16902)
vllmellm Apr 23, 2025
b2f195c
[V1] Avoid socket errors during shutdown when requests are in in-flig…
njhill Apr 23, 2025
d0da99f
[BugFix] llama4 fa3 fix - RuntimeError: scheduler_metadata must have …
LucasWilkinson Apr 23, 2025
ec69124
[Misc] Improve readability of get_open_port function. (#17024)
gitover22 Apr 23, 2025
8c87a9a
[Bugfix] Fix AssertionError: skip_special_tokens=False is not support…
chaunceyjiang Apr 23, 2025
ce17db8
[CI] Run v1/test_serial_utils.py in CI (#16996)
russellb Apr 23, 2025
aa72d9a
Mistral-format support for compressed-tensors (#16803)
mgoin Apr 23, 2025
6317a51
Categorize `tests/kernels/` based on kernel type (#16799)
mgoin Apr 23, 2025
f7912cb
[Doc] Add top anchor and a note to quantization/bitblas.md (#17042)
windsonsea Apr 23, 2025
53c0fa1
Ensure that `pid` passed to `kill_process_tree` is `int` for `mypy` (…
hmellor Apr 23, 2025
af869f6
[CI] Update structured-output label automation (#17055)
russellb Apr 23, 2025
8e630d6
Improve Transformers backend model loading QoL (#17039)
hmellor Apr 23, 2025
f3a21e9
`CacheConfig.block_size` should always be `int` when used (#17052)
hmellor Apr 23, 2025
bdb3660
Use `@property` and private field for `data_parallel_rank_local` (#17…
hmellor Apr 23, 2025
3cde34a
[Frontend] Support guidance:no-additional-properties for compatibilit…
tjohnson31415 Apr 23, 2025
32d4b66
[BugFix][V1] Fix int32 token index overflow when preparing input ids …
sarckk Apr 23, 2025
41fb013
[V1][Spec Decode] Always use argmax for sampling draft tokens (#16899)
WoosukKwon Apr 23, 2025
b07d741
[CI/Build] workaround for CI build failure (#17070)
csy1204 Apr 23, 2025
6b2427f
[Quantization]add prefix for commandA quantized model (#17017)
CXIAAAAA Apr 24, 2025
46e678b
[Minor] Use larger batch sizes for A100/B100/B200/MI300x (#17073)
WoosukKwon Apr 24, 2025
ed50f46
[Bugfix] Enable V1 usage stats (#16986)
mgoin Apr 24, 2025
2c8ed8e
More informative error when using Transformers backend (#16988)
hmellor Apr 24, 2025
ed2e464
Addendum Fix to support FIPS enabled machines with MD5 hashing (#17043)
sydarb Apr 24, 2025
6167c0e
[Bugfix][Core] add seq_id_to_seq_group clearing to avoid memory leak …
zhangyuygss Apr 24, 2025
db2f8d9
[V1] Update structured output (#16812)
reidliu41 Apr 24, 2025
9c1244d
[doc] update to hyperlink (#17096)
reidliu41 Apr 24, 2025
2bc0f72
Add docs for runai_streamer_sharded (#17093)
omer-dayan Apr 24, 2025
b411418
[Chore] Remove Sampler from Model Code (#17084)
WoosukKwon Apr 24, 2025
14288d1
Disable enforce_eager for V1 TPU sampler and structured output tests …
mgoin Apr 24, 2025
0a05ed5
Simplify `TokenizerGroup` (#16790)
hmellor Apr 24, 2025
a9138e8
Fix OOT registration test (#17099)
hmellor Apr 24, 2025
c0dfd97
[V1][PP] Optimization: continue scheduling prefill chunks (#17080)
ruisearch42 Apr 24, 2025
b0c1f62
[Misc] Remove OLMo2 config copy (#17066)
Isotr0py Apr 24, 2025
21f4f1c
Improve static type checking in `LoRAModelRunnerMixin` (#17104)
hmellor Apr 24, 2025
b724afe
[V1][Structured Output] Clear xgrammar compiler object when engine co…
shen-shanshan Apr 24, 2025
67309a1
[Frontend] Using matryoshka_dimensions control the allowed output dim…
noooop Apr 24, 2025
82e43b2
Add missing rocm_skinny_gemms kernel test to CI (#17060)
mgoin Apr 24, 2025
1bcbcbf
[Misc] refactor example series - structured outputs (#17040)
reidliu41 Apr 24, 2025
340d7b1
[V1][Spec Decoding] Add num_drafts and num_accepted_tokens_per_positi…
markmc Apr 24, 2025
4115f19
[CI] Add automation for the `tool-calling` github label (#17118)
russellb Apr 24, 2025
5adf6f6
Updating builkite job for IBM Power (#17111)
AaruniAggarwal Apr 24, 2025
49f1894
existing torch installation pip command fix for docs (#17059)
atilla00 Apr 24, 2025
47bdee4
Molmo Requirements (#17026)
Eyshika Apr 24, 2025
0422ce1
Add `:markdownhelp:` to `EngineArgs` docs so markdown docstrings rend…
hmellor Apr 24, 2025
0fa939e
Improve configs - `LoRAConfig` + `PromptAdapterConfig` (#16980)
hmellor Apr 24, 2025
6d0df0e
[Docs] Generate correct github links for decorated functions (#17125)
russellb Apr 24, 2025
fe92176
Add collective_rpc to llm engine (#16999)
yinghai Apr 24, 2025
05e1fbf
Add chat template for Llama 4 models (#16428)
maxdebayser Apr 24, 2025
583e900
[Misc] Add example to run DeepSeek with Ray Serve LLM (#17134)
ruisearch42 Apr 24, 2025
9420a1f
Better error message for missing mistral params.json (#17132)
mgoin Apr 24, 2025
0d6e187
Use custom address for listening socket (#15988)
jglaser Apr 25, 2025
eef3647
[FEAT] [ROCm]: AITER Fused MOE V1 Support (#16752)
vllmellm Apr 25, 2025
41ca7eb
[Attention] FA3 decode perf improvement - single mma warp group suppo…
LucasWilkinson Apr 25, 2025
69bff9b
fix float16 support for kimi-vl (#17156)
zhouzaida Apr 25, 2025
7a0a9da
[Doc] V1 : Update LoRA status (#17133)
varun-sundar-rabindranath Apr 25, 2025
6498189
[Docs] Fix True->true in supported_models.md (#17141)
mgoin Apr 25, 2025
6ca0234
Move missed `SchedulerConfig` args into scheduler config group in `En…
hmellor Apr 25, 2025
5aa6efb
[Misc] Clean up redundant code in uniproc_executor.py (#16762)
lifuhuang Apr 25, 2025
2f54045
[Bugfix][Misc] Use TritonPlaceholderModule to defensively import trit…
MengqingCao Apr 25, 2025
881f735
[Misc] Benchmark Serving Script Support Appending Results (#17028)
LucasWilkinson Apr 25, 2025
b22980a
[Perf]Optimize rotary_emb implementation to use Triton operator for i…
cynthieye Apr 25, 2025
6aae216
[Bugfix] remove fallback in guided_json (int range, patterns) (#16725)
csy1204 Apr 25, 2025
a41351f
[Quantization][FP8] Add support for FP8 models with input_scale for o…
rasmith Apr 25, 2025
ef19e67
[Doc] Add headings to improve gptqmodel.md (#17164)
windsonsea Apr 25, 2025
fc966e9
Only turn on FastIncrementalDetokenizer when tokenizers >= 0.21.1 (#1…
houseroad Apr 25, 2025
f851b84
[Doc] Add two links to disagg_prefill.md (#17168)
windsonsea Apr 25, 2025
7feae92
[Doc] Move todo out of beam search docstring (#17183)
alex-jw-brooks Apr 25, 2025
19dcc02
[Bugfix] Fix mistral model tests (#17181)
DarkLight1337 Apr 25, 2025
d5615af
[Bugfix] Fix Mistral ChatCompletionRequest Body Exception (#16769)
JasmondL Apr 25, 2025
8c211e5
Merge remote-tracking branch 'upstream/main'
gshtras Apr 25, 2025
a9e7a00
Fix API typo and remove FP8 on V1 restriction
gshtras Apr 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .buildkite/lm-eval-harness/test_lm_eval_correctness.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import pytest
import yaml

RTOL = 0.05
RTOL = 0.08
TEST_DATA_FILE = os.environ.get(
"LM_EVAL_TEST_DATA_FILE",
".buildkite/lm-eval-harness/configs/Meta-Llama-3-8B-Instruct.yaml")
Expand Down
15 changes: 11 additions & 4 deletions .buildkite/scripts/hardware_ci/run-cpu-test-ppc64le.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,30 @@
set -ex

# Setup cleanup
remove_docker_container() { podman rm -f cpu-test-ubi9-ppc || true; podman system prune -f; }
remove_docker_container() {
if [[ -n "$container_id" ]]; then
podman rm -f "$container_id" || true
fi
podman system prune -f
}
trap remove_docker_container EXIT
remove_docker_container

# Try building the docker image
podman build -t cpu-test-ubi9-ppc -f docker/Dockerfile.ppc64le .

# Run the image
podman run -itd --entrypoint /bin/bash -v /tmp/:/root/.cache/huggingface --privileged=true --network host -e HF_TOKEN --name cpu-test-ubi9-ppc cpu-test-ubi9-ppc
container_id=$(podman run -itd --entrypoint /bin/bash -v /tmp/:/root/.cache/huggingface --privileged=true --network host -e HF_TOKEN cpu-test-ubi9-ppc)

function cpu_tests() {

# offline inference
podman exec cpu-test-ubi9-ppc bash -c "
podman exec -it "$container_id" bash -c "
set -e
python3 examples/offline_inference/basic/generate.py --model facebook/opt-125m"

# Run basic model test
podman exec cpu-test-ubi9-ppc bash -c "
podman exec -it "$container_id" bash -c "
set -e
pip install pytest pytest-asyncio einops peft Pillow soundfile transformers_stream_generator matplotlib
pip install sentence-transformers datamodel_code_generator
Expand All @@ -33,6 +38,8 @@ function cpu_tests() {
}

# All of CPU tests are expected to be finished less than 40 mins.

export container_id
export -f cpu_tests
timeout 40m bash -c cpu_tests

5 changes: 4 additions & 1 deletion .buildkite/scripts/hardware_ci/run-tpu-v1-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ docker run --privileged --net host --shm-size=16G -it \
vllm-tpu /bin/bash -c "python3 -m pip install git+https://github.com/thuml/depyf.git \
&& python3 -m pip install pytest pytest-asyncio tpu-info \
&& python3 -m pip install lm_eval[api]==0.4.4 \
&& export VLLM_XLA_CACHE_PATH= \
&& export VLLM_USE_V1=1 \
&& export VLLM_XLA_CHECK_RECOMPILATION=1 \
&& echo HARDWARE \
Expand All @@ -44,7 +45,9 @@ docker run --privileged --net host --shm-size=16G -it \
&& echo TEST_9 \
&& pytest -s -v /workspace/vllm/tests/v1/tpu/test_multimodal.py \
&& echo TEST_10 \
&& pytest -s -v /workspace/vllm/tests/v1/tpu/test_pallas.py" \
&& pytest -s -v /workspace/vllm/tests/v1/tpu/test_pallas.py \
&& echo TEST_11 \
&& pytest -s -v /workspace/vllm/tests/v1/entrypoints/llm/test_struct_output_generate.py" \


# TODO: This test fails because it uses RANDOM_SEED sampling
Expand Down
42 changes: 39 additions & 3 deletions .buildkite/test-pipeline.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
# Documentation
# label(str): the name of the test. emoji allowed.
# fast_check(bool): whether to run this on each commit on fastcheck pipeline.
# torch_nightly(bool): whether to run this on vllm against torch nightly pipeline.
# fast_check_only(bool): run this test on fastcheck pipeline only
# optional(bool): never run this test by default (i.e. need to unblock manually) unless it's scheduled nightly run.
# command(str): the single command to run for tests. incompatible with commands.
Expand Down Expand Up @@ -70,6 +71,7 @@ steps:
- label: Basic Correctness Test # 30min
#mirror_hardwares: [amd]
fast_check: true
torch_nightly: true
source_file_dependencies:
- vllm/
- tests/basic_correctness/test_basic_correctness
Expand Down Expand Up @@ -106,6 +108,7 @@ steps:
- label: Entrypoints Test # 40min
working_dir: "/vllm-workspace/tests"
fast_check: true
torch_nightly: true
#mirror_hardwares: [amd]
amd_gpus: 2 # Just for the sake of queue testing
source_file_dependencies:
Expand Down Expand Up @@ -210,6 +213,7 @@ steps:
- pytest -v -s v1/worker
- pytest -v -s v1/structured_output
- pytest -v -s v1/spec_decode
- pytest -v -s v1/test_serial_utils.py
- pytest -v -s v1/test_stats.py
- pytest -v -s v1/test_utils.py
- pytest -v -s v1/test_oracle.py
Expand Down Expand Up @@ -327,11 +331,43 @@ steps:
amd_gpus: 8
source_file_dependencies:
- csrc/
- tests/kernels/core
commands:
- pytest -v -s kernels/core

- label: Kernels Attention Test %N
source_file_dependencies:
- csrc/attention/
- vllm/attention
- tests/kernels
- vllm/v1/attention
- tests/kernels/attention
commands:
- pytest -v -s kernels --shard-id=$$BUILDKITE_PARALLEL_JOB --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT
parallelism: 4
- pytest -v -s kernels/attention --shard-id=$$BUILDKITE_PARALLEL_JOB --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT
parallelism: 2

- label: Kernels Quantization Test %N
source_file_dependencies:
- csrc/quantization/
- vllm/model_executor/layers/quantization
- tests/kernels/quantization
commands:
- pytest -v -s kernels/quantization --shard-id=$$BUILDKITE_PARALLEL_JOB --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT
parallelism: 2

- label: Kernels MoE Test
source_file_dependencies:
- csrc/moe/
- tests/kernels/moe
- vllm/model_executor/layers/fused_moe/
commands:
- pytest -v -s kernels/moe

- label: Kernels Mamba Test
source_file_dependencies:
- csrc/mamba/
- tests/kernels/mamba
commands:
- pytest -v -s kernels/mamba

- label: Tensorizer Test # 11min
working_dir: "/vllm-workspace/tests"
Expand Down
34 changes: 32 additions & 2 deletions .github/mergify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,19 @@ pull_request_rules:
description: Automatically apply structured-output label
conditions:
- or:
- files~=^benchmarks/structured_schemas/
- files=benchmarks/benchmark_serving_structured_output.py
- files=benchmarks/run_structured_output_benchmark.sh
- files=docs/source/features/structured_outputs.md
- files=examples/offline_inference/structured_outputs.py
- files=examples/online_serving/openai_chat_completion_structured_outputs.py
- files=examples/online_serving/openai_chat_completion_structured_outputs_with_reasoning.py
- files~=^vllm/model_executor/guided_decoding/
- files=tests/model_executor/test_guided_processors.py
- files=tests/entrypoints/llm/test_guided_generate.py
- files=benchmarks/benchmark_serving_guided.py
- files=benchmarks/benchmark_guided.py
- files~=^tests/v1/structured_output/
- files=tests/v1/entrypoints/llm/test_guided_generate.py
- files~=^vllm/v1/structured_output/
actions:
label:
add:
Expand Down Expand Up @@ -118,6 +126,28 @@ pull_request_rules:
remove:
- tpu

- name: label-tool-calling
description: Automatically add tool-calling label
conditions:
- or:
- files~=^tests/tool_use/
- files~=^tests/mistral_tool_use/
- files~=^tests/entrypoints/openai/tool_parsers/
- files=tests/entrypoints/openai/test_chat_with_tool_reasoning.py
- files~=^vllm/entrypoints/openai/tool_parsers/
- files=docs/source/features/tool_calling.md
- files=docs/source/getting_started/examples/openai_chat_completion_client_with_tools.md
- files=docs/source/getting_started/examples/chat_with_tools.md
- files~=^examples/tool_chat_*
- files=examples/offline_inference/chat_with_tools.py
- files=examples/online_serving/openai_chat_completion_client_with_tools_required.py
- files=examples/online_serving/openai_chat_completion_tool_calls_with_reasoning.py
- files=examples/online_serving/openai_chat_completion_client_with_tools.py
actions:
label:
add:
- tool-calling

- name: ping author on conflicts and add 'needs-rebase' label
conditions:
- conflict
Expand Down
31 changes: 20 additions & 11 deletions benchmarks/benchmark_serving.py
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,7 @@ def main(args: argparse.Namespace):
))

# Save config and results to json
if args.save_result:
if args.save_result or args.append_result:
result_json: dict[str, Any] = {}

# Setup
Expand All @@ -734,6 +734,14 @@ def main(args: argparse.Namespace):
raise ValueError(
"Invalid metadata format. Please use KEY=VALUE format."
)
# Traffic
result_json["request_rate"] = (args.request_rate if args.request_rate
< float("inf") else "inf")
result_json["burstiness"] = args.burstiness
result_json["max_concurrency"] = args.max_concurrency

# Merge with benchmark result
result_json = {**result_json, **benchmark_result}

if not args.save_detailed:
# Remove fields with too many data points
Expand All @@ -744,15 +752,6 @@ def main(args: argparse.Namespace):
if field in result_json:
del result_json[field]

# Traffic
result_json["request_rate"] = (args.request_rate if args.request_rate
< float("inf") else "inf")
result_json["burstiness"] = args.burstiness
result_json["max_concurrency"] = args.max_concurrency

# Merge with benchmark result
result_json = {**result_json, **benchmark_result}

# Save to file
base_model_id = model_id.split("/")[-1]
max_concurrency_str = (f"-concurrency{args.max_concurrency}"
Expand All @@ -762,7 +761,12 @@ def main(args: argparse.Namespace):
file_name = args.result_filename
if args.result_dir:
file_name = os.path.join(args.result_dir, file_name)
with open(file_name, "w", encoding='utf-8') as outfile:
with open(file_name,
mode="a+" if args.append_result else "w",
encoding='utf-8') as outfile:
# Append a newline.
if args.append_result and outfile.tell() != 0:
outfile.write("\n")
json.dump(result_json, outfile)
save_to_pytorch_benchmark_format(args, result_json, file_name)

Expand Down Expand Up @@ -894,6 +898,11 @@ def main(args: argparse.Namespace):
help="When saving the results, whether to include per request "
"information such as response, error, ttfs, tpots, etc.",
)
parser.add_argument(
"--append-result",
action="store_true",
help="Append the benchmark result to the existing json file.",
)
parser.add_argument(
"--metadata",
metavar="KEY=VALUE",
Expand Down
14 changes: 7 additions & 7 deletions benchmarks/benchmark_serving_structured_output.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
except ImportError:
from argparse import ArgumentParser as FlexibleArgumentParser

from vllm.v1.structured_output.utils import (
from vllm.v1.structured_output.backend_xgrammar import (
has_xgrammar_unsupported_json_features)

MILLISECONDS_TO_SECONDS_CONVERSION = 1000
Expand Down Expand Up @@ -150,17 +150,17 @@ def get_schema(index: int):

elif args.dataset == "grammar":
schema = """
?start: select_statement
root ::= select_statement

?select_statement: "SELECT " column_list " FROM " table_name
select_statement ::= "SELECT " column " from " table " where " condition

?column_list: column_name ("," column_name)*
column ::= "col_1 " | "col_2 "

?table_name: identifier
table ::= "table_1 " | "table_2 "

?column_name: identifier
condition ::= column "= " number

?identifier: /[a-zA-Z_][a-zA-Z0-9_]*/
number ::= "1 " | "2 "
"""
prompt = "Generate an SQL query to show the 'username' \
and 'email' from the 'users' table."
Expand Down
10 changes: 8 additions & 2 deletions benchmarks/kernels/benchmark_lora.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,14 @@
from utils import ArgPool, Bench, CudaGraphBenchParams
from weight_shapes import WEIGHT_SHAPES

from vllm.lora.ops.triton_ops import LoRAKernelMeta, lora_expand, lora_shrink
from vllm.lora.ops.triton_ops.utils import _LORA_A_PTR_DICT, _LORA_B_PTR_DICT
from vllm.triton_utils import HAS_TRITON

if HAS_TRITON:
from vllm.lora.ops.triton_ops import (LoRAKernelMeta, lora_expand,
lora_shrink)
from vllm.lora.ops.triton_ops.utils import (_LORA_A_PTR_DICT,
_LORA_B_PTR_DICT)

from vllm.utils import FlexibleArgumentParser

DEFAULT_MODELS = list(WEIGHT_SHAPES.keys())
Expand Down
2 changes: 1 addition & 1 deletion cmake/external_projects/vllm_flash_attn.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ else()
FetchContent_Declare(
vllm-flash-attn
GIT_REPOSITORY https://github.com/vllm-project/flash-attention.git
GIT_TAG 0a721daebe4fa7149f06ecf3d3eabeb6dcd0f1fa
GIT_TAG 8798f27777fb57f447070301bf33a9f9c607f491
GIT_PROGRESS TRUE
# Don't share the vllm-flash-attn build between build types
BINARY_DIR ${CMAKE_BINARY_DIR}/vllm-flash-attn
Expand Down
6 changes: 6 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ ENV UV_HTTP_TIMEOUT=500
COPY requirements/lint.txt requirements/lint.txt
COPY requirements/test.txt requirements/test.txt
COPY requirements/dev.txt requirements/dev.txt
# Workaround for #17068
RUN --mount=type=cache,target=/root/.cache/uv \
uv pip install --system mamba-ssm==2.2.4 --no-build-isolation
RUN --mount=type=cache,target=/root/.cache/uv \
uv pip install --system -r requirements/dev.txt
#################### DEV IMAGE ####################
Expand Down Expand Up @@ -265,6 +268,9 @@ ADD . /vllm-workspace/
ENV UV_HTTP_TIMEOUT=500

# install development dependencies (for testing)
# Workaround for #17068
RUN --mount=type=cache,target=/root/.cache/uv \
uv pip install --system mamba-ssm==2.2.4 --no-build-isolation
RUN --mount=type=cache,target=/root/.cache/uv \
uv pip install --system -r requirements/dev.txt

Expand Down
Loading