diff --git a/docs/_static/llama-stack-spec.html b/docs/_static/llama-stack-spec.html
index 63c68d835..a37da024b 100644
--- a/docs/_static/llama-stack-spec.html
+++ b/docs/_static/llama-stack-spec.html
@@ -40,7 +40,7 @@
}
],
"paths": {
- "/v1/datasetio/append-rows/{dataset_id}": {
+ "/v1beta/datasetio/append-rows/{dataset_id}": {
"post": {
"responses": {
"200": {
@@ -1155,7 +1155,7 @@
}
}
},
- "/v1/eval/benchmarks/{benchmark_id}/evaluations": {
+ "/v1beta/eval/benchmarks/{benchmark_id}/evaluations": {
"post": {
"responses": {
"200": {
@@ -1459,7 +1459,7 @@
]
}
},
- "/v1/datasets/{dataset_id}": {
+ "/v1beta/datasets/{dataset_id}": {
"get": {
"responses": {
"200": {
@@ -1767,7 +1767,7 @@
]
}
},
- "/v1/telemetry/traces/{trace_id}/spans/{span_id}": {
+ "/v1beta/telemetry/traces/{trace_id}/spans/{span_id}": {
"get": {
"responses": {
"200": {
@@ -1819,7 +1819,7 @@
]
}
},
- "/v1/telemetry/spans/{span_id}/tree": {
+ "/v1beta/telemetry/spans/{span_id}/tree": {
"post": {
"responses": {
"200": {
@@ -1992,7 +1992,7 @@
]
}
},
- "/v1/telemetry/traces/{trace_id}": {
+ "/v1beta/telemetry/traces/{trace_id}": {
"get": {
"responses": {
"200": {
@@ -2422,7 +2422,7 @@
}
}
},
- "/v1/datasetio/iterrows/{dataset_id}": {
+ "/v1beta/datasetio/iterrows/{dataset_id}": {
"get": {
"responses": {
"200": {
@@ -2483,7 +2483,7 @@
]
}
},
- "/v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}": {
+ "/v1beta/eval/benchmarks/{benchmark_id}/jobs/{job_id}": {
"get": {
"responses": {
"200": {
@@ -2578,7 +2578,7 @@
]
}
},
- "/v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result": {
+ "/v1beta/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result": {
"get": {
"responses": {
"200": {
@@ -2876,7 +2876,7 @@
}
}
},
- "/v1/datasets": {
+ "/v1beta/datasets": {
"get": {
"responses": {
"200": {
@@ -3601,7 +3601,7 @@
}
}
},
- "/v1/telemetry/events": {
+ "/v1beta/telemetry/events": {
"post": {
"responses": {
"200": {
@@ -4810,7 +4810,7 @@
}
}
},
- "/v1/telemetry/metrics/{metric_name}": {
+ "/v1beta/telemetry/metrics/{metric_name}": {
"post": {
"responses": {
"200": {
@@ -4863,7 +4863,7 @@
}
}
},
- "/v1/telemetry/spans": {
+ "/v1beta/telemetry/spans": {
"post": {
"responses": {
"200": {
@@ -4906,7 +4906,7 @@
}
}
},
- "/v1/telemetry/traces": {
+ "/v1beta/telemetry/traces": {
"post": {
"responses": {
"200": {
@@ -5068,7 +5068,7 @@
}
}
},
- "/v1/eval/benchmarks/{benchmark_id}/jobs": {
+ "/v1beta/eval/benchmarks/{benchmark_id}/jobs": {
"post": {
"responses": {
"200": {
@@ -5207,7 +5207,7 @@
}
}
},
- "/v1/telemetry/spans/export": {
+ "/v1beta/telemetry/spans/export": {
"post": {
"responses": {
"200": {
diff --git a/docs/_static/llama-stack-spec.yaml b/docs/_static/llama-stack-spec.yaml
index ea7d3248d..0ea382bc6 100644
--- a/docs/_static/llama-stack-spec.yaml
+++ b/docs/_static/llama-stack-spec.yaml
@@ -10,7 +10,7 @@ info:
servers:
- url: http://any-hosted-llama-stack.com
paths:
- /v1/datasetio/append-rows/{dataset_id}:
+ /v1beta/datasetio/append-rows/{dataset_id}:
post:
responses:
'200':
@@ -798,7 +798,7 @@ paths:
schema:
$ref: '#/components/schemas/EmbeddingsRequest'
required: true
- /v1/eval/benchmarks/{benchmark_id}/evaluations:
+ /v1beta/eval/benchmarks/{benchmark_id}/evaluations:
post:
responses:
'200':
@@ -1007,7 +1007,7 @@ paths:
required: true
schema:
type: string
- /v1/datasets/{dataset_id}:
+ /v1beta/datasets/{dataset_id}:
get:
responses:
'200':
@@ -1222,7 +1222,7 @@ paths:
required: true
schema:
type: string
- /v1/telemetry/traces/{trace_id}/spans/{span_id}:
+ /v1beta/telemetry/traces/{trace_id}/spans/{span_id}:
get:
responses:
'200':
@@ -1258,7 +1258,7 @@ paths:
required: true
schema:
type: string
- /v1/telemetry/spans/{span_id}/tree:
+ /v1beta/telemetry/spans/{span_id}/tree:
post:
responses:
'200':
@@ -1375,7 +1375,7 @@ paths:
required: true
schema:
type: string
- /v1/telemetry/traces/{trace_id}:
+ /v1beta/telemetry/traces/{trace_id}:
get:
responses:
'200':
@@ -1678,7 +1678,7 @@ paths:
schema:
$ref: '#/components/schemas/InvokeToolRequest'
required: true
- /v1/datasetio/iterrows/{dataset_id}:
+ /v1beta/datasetio/iterrows/{dataset_id}:
get:
responses:
'200':
@@ -1735,7 +1735,7 @@ paths:
required: false
schema:
type: integer
- /v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}:
+ /v1beta/eval/benchmarks/{benchmark_id}/jobs/{job_id}:
get:
responses:
'200':
@@ -1802,7 +1802,7 @@ paths:
required: true
schema:
type: string
- /v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result:
+ /v1beta/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result:
get:
responses:
'200':
@@ -2010,7 +2010,7 @@ paths:
schema:
$ref: '#/components/schemas/OpenaiChatCompletionRequest'
required: true
- /v1/datasets:
+ /v1beta/datasets:
get:
responses:
'200':
@@ -2524,7 +2524,7 @@ paths:
schema:
$ref: '#/components/schemas/RegisterVectorDbRequest'
required: true
- /v1/telemetry/events:
+ /v1beta/telemetry/events:
post:
responses:
'200':
@@ -3414,7 +3414,7 @@ paths:
schema:
$ref: '#/components/schemas/QueryChunksRequest'
required: true
- /v1/telemetry/metrics/{metric_name}:
+ /v1beta/telemetry/metrics/{metric_name}:
post:
responses:
'200':
@@ -3449,7 +3449,7 @@ paths:
schema:
$ref: '#/components/schemas/QueryMetricsRequest'
required: true
- /v1/telemetry/spans:
+ /v1beta/telemetry/spans:
post:
responses:
'200':
@@ -3478,7 +3478,7 @@ paths:
schema:
$ref: '#/components/schemas/QuerySpansRequest'
required: true
- /v1/telemetry/traces:
+ /v1beta/telemetry/traces:
post:
responses:
'200':
@@ -3595,7 +3595,7 @@ paths:
schema:
$ref: '#/components/schemas/ResumeAgentTurnRequest'
required: true
- /v1/eval/benchmarks/{benchmark_id}/jobs:
+ /v1beta/eval/benchmarks/{benchmark_id}/jobs:
post:
responses:
'200':
@@ -3691,7 +3691,7 @@ paths:
schema:
$ref: '#/components/schemas/RunShieldRequest'
required: true
- /v1/telemetry/spans/export:
+ /v1beta/telemetry/spans/export:
post:
responses:
'200':
diff --git a/llama_stack/apis/datasetio/datasetio.py b/llama_stack/apis/datasetio/datasetio.py
index 1183983cc..449bd22d7 100644
--- a/llama_stack/apis/datasetio/datasetio.py
+++ b/llama_stack/apis/datasetio/datasetio.py
@@ -20,7 +20,7 @@ class DatasetIO(Protocol):
# keeping for aligning with inference/safety, but this is not used
dataset_store: DatasetStore
- @webmethod(route="/datasetio/iterrows/{dataset_id:path}", method="GET")
+ @webmethod(route="/datasetio/iterrows/{dataset_id:path}", method="GET", level="v1beta")
async def iterrows(
self,
dataset_id: str,
@@ -44,7 +44,7 @@ class DatasetIO(Protocol):
"""
...
- @webmethod(route="/datasetio/append-rows/{dataset_id:path}", method="POST")
+ @webmethod(route="/datasetio/append-rows/{dataset_id:path}", method="POST", level="v1beta")
async def append_rows(self, dataset_id: str, rows: list[dict[str, Any]]) -> None:
"""Append rows to a dataset.
diff --git a/llama_stack/apis/datasets/datasets.py b/llama_stack/apis/datasets/datasets.py
index f347e0e29..1d5869455 100644
--- a/llama_stack/apis/datasets/datasets.py
+++ b/llama_stack/apis/datasets/datasets.py
@@ -145,7 +145,7 @@ class ListDatasetsResponse(BaseModel):
class Datasets(Protocol):
- @webmethod(route="/datasets", method="POST")
+ @webmethod(route="/datasets", method="POST", level="v1beta")
async def register_dataset(
self,
purpose: DatasetPurpose,
@@ -214,7 +214,7 @@ class Datasets(Protocol):
"""
...
- @webmethod(route="/datasets/{dataset_id:path}", method="GET")
+ @webmethod(route="/datasets/{dataset_id:path}", method="GET", level="v1beta")
async def get_dataset(
self,
dataset_id: str,
@@ -226,7 +226,7 @@ class Datasets(Protocol):
"""
...
- @webmethod(route="/datasets", method="GET")
+ @webmethod(route="/datasets", method="GET", level="v1beta")
async def list_datasets(self) -> ListDatasetsResponse:
"""List all datasets.
@@ -234,7 +234,7 @@ class Datasets(Protocol):
"""
...
- @webmethod(route="/datasets/{dataset_id:path}", method="DELETE")
+ @webmethod(route="/datasets/{dataset_id:path}", method="DELETE", level="v1beta")
async def unregister_dataset(
self,
dataset_id: str,
diff --git a/llama_stack/apis/eval/eval.py b/llama_stack/apis/eval/eval.py
index 83a0a8e56..ea3a72713 100644
--- a/llama_stack/apis/eval/eval.py
+++ b/llama_stack/apis/eval/eval.py
@@ -83,7 +83,7 @@ class EvaluateResponse(BaseModel):
class Eval(Protocol):
"""Llama Stack Evaluation API for running evaluations on model and agent candidates."""
- @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs", method="POST")
+ @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs", method="POST", level="v1beta")
async def run_eval(
self,
benchmark_id: str,
@@ -97,7 +97,7 @@ class Eval(Protocol):
"""
...
- @webmethod(route="/eval/benchmarks/{benchmark_id}/evaluations", method="POST")
+ @webmethod(route="/eval/benchmarks/{benchmark_id}/evaluations", method="POST", level="v1beta")
async def evaluate_rows(
self,
benchmark_id: str,
@@ -115,7 +115,7 @@ class Eval(Protocol):
"""
...
- @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="GET")
+ @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="GET", level="v1beta")
async def job_status(self, benchmark_id: str, job_id: str) -> Job:
"""Get the status of a job.
@@ -125,7 +125,7 @@ class Eval(Protocol):
"""
...
- @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="DELETE")
+ @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="DELETE", level="v1beta")
async def job_cancel(self, benchmark_id: str, job_id: str) -> None:
"""Cancel a job.
@@ -134,7 +134,7 @@ class Eval(Protocol):
"""
...
- @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result", method="GET")
+ @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result", method="GET", level="v1beta")
async def job_result(self, benchmark_id: str, job_id: str) -> EvaluateResponse:
"""Get the result of a job.
diff --git a/llama_stack/apis/telemetry/telemetry.py b/llama_stack/apis/telemetry/telemetry.py
index 8d1b5d697..b309ebb0a 100644
--- a/llama_stack/apis/telemetry/telemetry.py
+++ b/llama_stack/apis/telemetry/telemetry.py
@@ -412,7 +412,7 @@ class QueryMetricsResponse(BaseModel):
@runtime_checkable
class Telemetry(Protocol):
- @webmethod(route="/telemetry/events", method="POST")
+ @webmethod(route="/telemetry/events", method="POST", level="v1beta")
async def log_event(
self,
event: Event,
@@ -425,7 +425,7 @@ class Telemetry(Protocol):
"""
...
- @webmethod(route="/telemetry/traces", method="POST", required_scope=REQUIRED_SCOPE)
+ @webmethod(route="/telemetry/traces", method="POST", required_scope=REQUIRED_SCOPE, level="v1beta")
async def query_traces(
self,
attribute_filters: list[QueryCondition] | None = None,
@@ -443,7 +443,7 @@ class Telemetry(Protocol):
"""
...
- @webmethod(route="/telemetry/traces/{trace_id:path}", method="GET", required_scope=REQUIRED_SCOPE)
+ @webmethod(route="/telemetry/traces/{trace_id:path}", method="GET", required_scope=REQUIRED_SCOPE, level="v1beta")
async def get_trace(self, trace_id: str) -> Trace:
"""Get a trace by its ID.
@@ -453,7 +453,10 @@ class Telemetry(Protocol):
...
@webmethod(
- route="/telemetry/traces/{trace_id:path}/spans/{span_id:path}", method="GET", required_scope=REQUIRED_SCOPE
+ route="/telemetry/traces/{trace_id:path}/spans/{span_id:path}",
+ method="GET",
+ required_scope=REQUIRED_SCOPE,
+ level="v1beta",
)
async def get_span(self, trace_id: str, span_id: str) -> Span:
"""Get a span by its ID.
@@ -464,7 +467,9 @@ class Telemetry(Protocol):
"""
...
- @webmethod(route="/telemetry/spans/{span_id:path}/tree", method="POST", required_scope=REQUIRED_SCOPE)
+ @webmethod(
+ route="/telemetry/spans/{span_id:path}/tree", method="POST", required_scope=REQUIRED_SCOPE, level="v1beta"
+ )
async def get_span_tree(
self,
span_id: str,
@@ -480,7 +485,7 @@ class Telemetry(Protocol):
"""
...
- @webmethod(route="/telemetry/spans", method="POST", required_scope=REQUIRED_SCOPE)
+ @webmethod(route="/telemetry/spans", method="POST", required_scope=REQUIRED_SCOPE, level="v1beta")
async def query_spans(
self,
attribute_filters: list[QueryCondition],
@@ -496,7 +501,7 @@ class Telemetry(Protocol):
"""
...
- @webmethod(route="/telemetry/spans/export", method="POST")
+ @webmethod(route="/telemetry/spans/export", method="POST", level="v1beta")
async def save_spans_to_dataset(
self,
attribute_filters: list[QueryCondition],
@@ -513,7 +518,7 @@ class Telemetry(Protocol):
"""
...
- @webmethod(route="/telemetry/metrics/{metric_name}", method="POST", required_scope=REQUIRED_SCOPE)
+ @webmethod(route="/telemetry/metrics/{metric_name}", method="POST", required_scope=REQUIRED_SCOPE, level="v1beta")
async def query_metrics(
self,
metric_name: str,
diff --git a/llama_stack/providers/remote/datasetio/nvidia/datasetio.py b/llama_stack/providers/remote/datasetio/nvidia/datasetio.py
index f723c92cc..948d11055 100644
--- a/llama_stack/providers/remote/datasetio/nvidia/datasetio.py
+++ b/llama_stack/providers/remote/datasetio/nvidia/datasetio.py
@@ -78,7 +78,7 @@ class NvidiaDatasetIOAdapter:
request_body["description"] = dataset_def.metadata.get("description")
await self._make_request(
"POST",
- "/v1/datasets",
+ "/v1beta/datasets",
json=request_body,
)
return dataset_def
@@ -100,7 +100,7 @@ class NvidiaDatasetIOAdapter:
) -> None:
await self._make_request(
"DELETE",
- f"/v1/datasets/{self.config.dataset_namespace}/{dataset_id}",
+ f"/v1beta/datasets/{self.config.dataset_namespace}/{dataset_id}",
headers={"Accept": "application/json", "Content-Type": "application/json"},
)
diff --git a/tests/unit/providers/nvidia/test_datastore.py b/tests/unit/providers/nvidia/test_datastore.py
index b59636f7b..bf146adb2 100644
--- a/tests/unit/providers/nvidia/test_datastore.py
+++ b/tests/unit/providers/nvidia/test_datastore.py
@@ -67,7 +67,7 @@ def test_register_dataset(nvidia_adapter, run_async):
_assert_request(
mock_make_request,
"POST",
- "/v1/datasets",
+ "/v1beta/datasets",
expected_json={
"name": "test-dataset",
"namespace": "default",
@@ -91,7 +91,7 @@ def test_unregister_dataset(nvidia_adapter, run_async):
run_async(adapter.unregister_dataset(dataset_id))
mock_make_request.assert_called_once()
- _assert_request(mock_make_request, "DELETE", "/v1/datasets/default/test-dataset")
+ _assert_request(mock_make_request, "DELETE", "/v1beta/datasets/default/test-dataset")
def test_register_dataset_with_custom_namespace_project(run_async):
@@ -130,7 +130,7 @@ def test_register_dataset_with_custom_namespace_project(run_async):
_assert_request(
mock_make_request,
"POST",
- "/v1/datasets",
+ "/v1beta/datasets",
expected_json={
"name": "test-dataset",
"namespace": "custom-namespace",