feat: convert Benchmarks API to use FastAPI router (#4309)

# What does this PR do?

Convert the Benchmarks API from @webmethod decorators to FastAPI router
pattern, matching the Batches API structure.

One notable change is the update of stack.py to handle request models in
register_resources().

Closes: #4308 

## Test Plan

CI and `curl http://localhost:8321/v1/inspect/routes | jq '.data[] |
select(.route | contains("benchmark"))'`

---------

Signed-off-by: Sébastien Han <seb@redhat.com>
This commit is contained in:
Sébastien Han 2025-12-10 15:04:27 +01:00 committed by GitHub
parent 661985e240
commit ff375f1abb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 862 additions and 195 deletions

View file

@ -22,14 +22,17 @@ from llama_stack_api import (
Api,
Dataset,
DatasetPurpose,
ListBenchmarksRequest,
ListToolDefsResponse,
Model,
ModelNotFoundError,
ModelType,
NumberType,
RegisterBenchmarkRequest,
Shield,
ToolDef,
ToolGroup,
UnregisterBenchmarkRequest,
URIDataSource,
)
@ -420,24 +423,26 @@ async def test_benchmarks_routing_table(cached_disk_dist_registry):
# Register multiple benchmarks and verify listing
await table.register_benchmark(
benchmark_id="test-benchmark",
dataset_id="test-dataset",
scoring_functions=["test-scoring-fn", "test-scoring-fn-2"],
RegisterBenchmarkRequest(
benchmark_id="test-benchmark",
dataset_id="test-dataset",
scoring_functions=["test-scoring-fn", "test-scoring-fn-2"],
)
)
benchmarks = await table.list_benchmarks()
benchmarks = await table.list_benchmarks(ListBenchmarksRequest())
assert len(benchmarks.data) == 1
benchmark_ids = {b.identifier for b in benchmarks.data}
assert "test-benchmark" in benchmark_ids
# Unregister the benchmark and verify removal
await table.unregister_benchmark(benchmark_id="test-benchmark")
benchmarks_after = await table.list_benchmarks()
await table.unregister_benchmark(UnregisterBenchmarkRequest(benchmark_id="test-benchmark"))
benchmarks_after = await table.list_benchmarks(ListBenchmarksRequest())
assert len(benchmarks_after.data) == 0
# Unregistering a non-existent benchmark should raise a clear error
with pytest.raises(ValueError, match="Benchmark 'dummy_benchmark' not found"):
await table.unregister_benchmark(benchmark_id="dummy_benchmark")
await table.unregister_benchmark(UnregisterBenchmarkRequest(benchmark_id="dummy_benchmark"))
async def test_tool_groups_routing_table(cached_disk_dist_registry):