From 44d31ce2f232a9446316ba0aa765048ad744f158 Mon Sep 17 00:00:00 2001 From: Yunfeng Zhang Date: Thu, 6 Aug 2026 16:55:03 +0000 Subject: [PATCH] fix(ci): keep source-only indexes in GPU test env resolution The GPU setup action infers which indexes to pass to uv by matching the CUDA extra against each index name or URL. Every index predated the inference and encoded its variant one of those two ways, so the rule held. PR #664 then added the flashinfer-cubin index, which serves a single variant-agnostic https://flashinfer.ai/whl/ and is routed to packages only through [tool.uv.sources]. It matches neither branch of the rule, so it was dropped from the index list, and because the install also passes --no-sources there was nothing left to reach it. flashinfer-cubin 0.6.14 exists only on that index (PyPI stops at 0.6.13, and the /cu129 subpath does not serve the package at all), so GPU smoke and e2e both failed to resolve. Collect indexes referenced by [tool.uv.sources] for the target extra as well. This restores https://flashinfer.ai/whl/ to the index list, matching the documented manual install command. Signed-off-by: Yunfeng Zhang --- .github/actions/setup-gpu-test-env/action.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup-gpu-test-env/action.yml b/.github/actions/setup-gpu-test-env/action.yml index 1becddc7a..818704890 100644 --- a/.github/actions/setup-gpu-test-env/action.yml +++ b/.github/actions/setup-gpu-test-env/action.yml @@ -81,15 +81,31 @@ runs: import tomllib with open(sys.argv[1], "rb") as handle: - indexes = tomllib.load(handle)["tool"]["uv"]["index"] + uv_config = tomllib.load(handle)["tool"]["uv"] + indexes = uv_config["index"] cuda_extra = sys.argv[2] + + # Some indexes are reached only through [tool.uv.sources] and carry no + # CUDA variant in their name or URL (flashinfer-cubin serves a single + # https://flashinfer.ai/whl/ for every extra). We pass --no-sources + # below, so collect those by their declared extra or they are dropped. + source_indexes = { + entry["index"] + for value in uv_config.get("sources", {}).values() + for entry in (value if isinstance(value, list) else [value]) + if isinstance(entry, dict) + and entry.get("extra") == cuda_extra + and "index" in entry + } + print( "\n".join( index["url"] for index in indexes if index["name"].endswith(f"-{cuda_extra}") or f"/{cuda_extra}" in index["url"] + or index["name"] in source_indexes ) ) PY