Skip to content

Commit 73a05fd

Browse files
authored
Sync SDK with latest API changes (#87)
# What does this PR do? New rest API changes are being synced ## Test Plan ``` LLAMA_STACK_CONFIG="/Users/dineshyv/.llama/distributions/llamastack-fireworks/fireworks-run.yaml" pytest -v tests/client-sdk/agents/test_agents.py /Users/dineshyv/miniconda3/envs/stack/lib/python3.10/site-packages/pytest_asyncio/plugin.py:208: PytestDeprecationWarning: The configuration option "asyncio_default_fixture_loop_scope" is unset. The event loop scope for asynchronous fixtures will default to the fixture caching scope. Future versions of pytest-asyncio will default the loop scope for asynchronous fixtures to function scope. Set the default fixture loop scope explicitly in order to avoid unexpected behavior in the future. Valid fixture loop scopes are: "function", "class", "module", "package", "session" warnings.warn(PytestDeprecationWarning(_DEFAULT_FIXTURE_LOOP_SCOPE_UNSET)) ===================================================================================== test session starts ===================================================================================== platform darwin -- Python 3.10.15, pytest-8.3.3, pluggy-1.5.0 -- /Users/dineshyv/miniconda3/envs/stack/bin/python cachedir: .pytest_cache rootdir: /Users/dineshyv/code/llama-stack configfile: pyproject.toml plugins: asyncio-0.24.0, anyio-4.8.0 asyncio: mode=strict, default_loop_scope=None collected 6 items tests/client-sdk/agents/test_agents.py::test_agent_simple PASSED [ 16%] tests/client-sdk/agents/test_agents.py::test_builtin_tool_web_search PASSED [ 33%] tests/client-sdk/agents/test_agents.py::test_builtin_tool_code_execution PASSED [ 50%] tests/client-sdk/agents/test_agents.py::test_code_execution PASSED [ 66%] tests/client-sdk/agents/test_agents.py::test_custom_tool PASSED [ 83%] tests/client-sdk/agents/test_agents.py::test_rag_agent PASSED [100%] =============================================================================== 6 passed, 5 warnings in 45.74s ================================================================================ ```
1 parent fb3ef47 commit 73a05fd

18 files changed

+1004
-349
lines changed

src/llama_stack_client/_client.py

Lines changed: 221 additions & 100 deletions
Large diffs are not rendered by default.

src/llama_stack_client/resources/eval/eval.py

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ def with_streaming_response(self) -> EvalResourceWithStreamingResponse:
6262

6363
def evaluate_rows(
6464
self,
65+
task_id: str,
6566
*,
6667
input_rows: Iterable[Dict[str, Union[bool, float, str, Iterable[object], object, None]]],
6768
scoring_functions: List[str],
6869
task_config: eval_evaluate_rows_params.TaskConfig,
69-
task_id: str,
7070
x_llama_stack_client_version: str | NotGiven = NOT_GIVEN,
7171
x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN,
7272
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -86,6 +86,8 @@ def evaluate_rows(
8686
8787
timeout: Override the client-level default timeout for this request, in seconds
8888
"""
89+
if not task_id:
90+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
8991
extra_headers = {
9092
**strip_not_given(
9193
{
@@ -96,13 +98,12 @@ def evaluate_rows(
9698
**(extra_headers or {}),
9799
}
98100
return self._post(
99-
"/v1/eval/evaluate-rows",
101+
f"/v1/eval/tasks/{task_id}/evaluations",
100102
body=maybe_transform(
101103
{
102104
"input_rows": input_rows,
103105
"scoring_functions": scoring_functions,
104106
"task_config": task_config,
105-
"task_id": task_id,
106107
},
107108
eval_evaluate_rows_params.EvalEvaluateRowsParams,
108109
),
@@ -114,9 +115,9 @@ def evaluate_rows(
114115

115116
def run_eval(
116117
self,
118+
task_id: str,
117119
*,
118120
task_config: eval_run_eval_params.TaskConfig,
119-
task_id: str,
120121
x_llama_stack_client_version: str | NotGiven = NOT_GIVEN,
121122
x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN,
122123
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -136,6 +137,8 @@ def run_eval(
136137
137138
timeout: Override the client-level default timeout for this request, in seconds
138139
"""
140+
if not task_id:
141+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
139142
extra_headers = {
140143
**strip_not_given(
141144
{
@@ -146,14 +149,8 @@ def run_eval(
146149
**(extra_headers or {}),
147150
}
148151
return self._post(
149-
"/v1/eval/run",
150-
body=maybe_transform(
151-
{
152-
"task_config": task_config,
153-
"task_id": task_id,
154-
},
155-
eval_run_eval_params.EvalRunEvalParams,
156-
),
152+
f"/v1/eval/tasks/{task_id}/jobs",
153+
body=maybe_transform({"task_config": task_config}, eval_run_eval_params.EvalRunEvalParams),
157154
options=make_request_options(
158155
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
159156
),
@@ -187,11 +184,11 @@ def with_streaming_response(self) -> AsyncEvalResourceWithStreamingResponse:
187184

188185
async def evaluate_rows(
189186
self,
187+
task_id: str,
190188
*,
191189
input_rows: Iterable[Dict[str, Union[bool, float, str, Iterable[object], object, None]]],
192190
scoring_functions: List[str],
193191
task_config: eval_evaluate_rows_params.TaskConfig,
194-
task_id: str,
195192
x_llama_stack_client_version: str | NotGiven = NOT_GIVEN,
196193
x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN,
197194
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -211,6 +208,8 @@ async def evaluate_rows(
211208
212209
timeout: Override the client-level default timeout for this request, in seconds
213210
"""
211+
if not task_id:
212+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
214213
extra_headers = {
215214
**strip_not_given(
216215
{
@@ -221,13 +220,12 @@ async def evaluate_rows(
221220
**(extra_headers or {}),
222221
}
223222
return await self._post(
224-
"/v1/eval/evaluate-rows",
223+
f"/v1/eval/tasks/{task_id}/evaluations",
225224
body=await async_maybe_transform(
226225
{
227226
"input_rows": input_rows,
228227
"scoring_functions": scoring_functions,
229228
"task_config": task_config,
230-
"task_id": task_id,
231229
},
232230
eval_evaluate_rows_params.EvalEvaluateRowsParams,
233231
),
@@ -239,9 +237,9 @@ async def evaluate_rows(
239237

240238
async def run_eval(
241239
self,
240+
task_id: str,
242241
*,
243242
task_config: eval_run_eval_params.TaskConfig,
244-
task_id: str,
245243
x_llama_stack_client_version: str | NotGiven = NOT_GIVEN,
246244
x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN,
247245
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -261,6 +259,8 @@ async def run_eval(
261259
262260
timeout: Override the client-level default timeout for this request, in seconds
263261
"""
262+
if not task_id:
263+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
264264
extra_headers = {
265265
**strip_not_given(
266266
{
@@ -271,14 +271,8 @@ async def run_eval(
271271
**(extra_headers or {}),
272272
}
273273
return await self._post(
274-
"/v1/eval/run",
275-
body=await async_maybe_transform(
276-
{
277-
"task_config": task_config,
278-
"task_id": task_id,
279-
},
280-
eval_run_eval_params.EvalRunEvalParams,
281-
),
274+
f"/v1/eval/tasks/{task_id}/jobs",
275+
body=await async_maybe_transform({"task_config": task_config}, eval_run_eval_params.EvalRunEvalParams),
282276
options=make_request_options(
283277
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
284278
),

src/llama_stack_client/resources/eval/jobs.py

Lines changed: 31 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@
77
import httpx
88

99
from ..._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven
10-
from ..._utils import (
11-
maybe_transform,
12-
strip_not_given,
13-
async_maybe_transform,
14-
)
10+
from ..._utils import strip_not_given
1511
from ..._compat import cached_property
1612
from ..._resource import SyncAPIResource, AsyncAPIResource
1713
from ..._response import (
@@ -20,7 +16,6 @@
2016
async_to_raw_response_wrapper,
2117
async_to_streamed_response_wrapper,
2218
)
23-
from ...types.eval import job_cancel_params, job_status_params, job_retrieve_params
2419
from ..._base_client import make_request_options
2520
from ...types.evaluate_response import EvaluateResponse
2621
from ...types.eval.job_status_response import JobStatusResponse
@@ -72,6 +67,8 @@ def retrieve(
7267
7368
timeout: Override the client-level default timeout for this request, in seconds
7469
"""
70+
if not task_id:
71+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
7572
if not job_id:
7673
raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}")
7774
extra_headers = {
@@ -84,21 +81,17 @@ def retrieve(
8481
**(extra_headers or {}),
8582
}
8683
return self._get(
87-
f"/v1/eval/jobs/{job_id}/result",
84+
f"/v1/eval/tasks/{task_id}/jobs/{job_id}/result",
8885
options=make_request_options(
89-
extra_headers=extra_headers,
90-
extra_query=extra_query,
91-
extra_body=extra_body,
92-
timeout=timeout,
93-
query=maybe_transform({"task_id": task_id}, job_retrieve_params.JobRetrieveParams),
86+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
9487
),
9588
cast_to=EvaluateResponse,
9689
)
9790

9891
def cancel(
9992
self,
100-
*,
10193
job_id: str,
94+
*,
10295
task_id: str,
10396
x_llama_stack_client_version: str | NotGiven = NOT_GIVEN,
10497
x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN,
@@ -119,6 +112,10 @@ def cancel(
119112
120113
timeout: Override the client-level default timeout for this request, in seconds
121114
"""
115+
if not task_id:
116+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
117+
if not job_id:
118+
raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}")
122119
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
123120
extra_headers = {
124121
**strip_not_given(
@@ -129,15 +126,8 @@ def cancel(
129126
),
130127
**(extra_headers or {}),
131128
}
132-
return self._post(
133-
"/v1/eval/jobs/cancel",
134-
body=maybe_transform(
135-
{
136-
"job_id": job_id,
137-
"task_id": task_id,
138-
},
139-
job_cancel_params.JobCancelParams,
140-
),
129+
return self._delete(
130+
f"/v1/eval/tasks/{task_id}/jobs/{job_id}",
141131
options=make_request_options(
142132
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
143133
),
@@ -168,6 +158,8 @@ def status(
168158
169159
timeout: Override the client-level default timeout for this request, in seconds
170160
"""
161+
if not task_id:
162+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
171163
if not job_id:
172164
raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}")
173165
extra_headers = {
@@ -180,13 +172,9 @@ def status(
180172
**(extra_headers or {}),
181173
}
182174
return self._get(
183-
f"/v1/eval/jobs/{job_id}",
175+
f"/v1/eval/tasks/{task_id}/jobs/{job_id}",
184176
options=make_request_options(
185-
extra_headers=extra_headers,
186-
extra_query=extra_query,
187-
extra_body=extra_body,
188-
timeout=timeout,
189-
query=maybe_transform({"task_id": task_id}, job_status_params.JobStatusParams),
177+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
190178
),
191179
cast_to=JobStatusResponse,
192180
)
@@ -236,6 +224,8 @@ async def retrieve(
236224
237225
timeout: Override the client-level default timeout for this request, in seconds
238226
"""
227+
if not task_id:
228+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
239229
if not job_id:
240230
raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}")
241231
extra_headers = {
@@ -248,21 +238,17 @@ async def retrieve(
248238
**(extra_headers or {}),
249239
}
250240
return await self._get(
251-
f"/v1/eval/jobs/{job_id}/result",
241+
f"/v1/eval/tasks/{task_id}/jobs/{job_id}/result",
252242
options=make_request_options(
253-
extra_headers=extra_headers,
254-
extra_query=extra_query,
255-
extra_body=extra_body,
256-
timeout=timeout,
257-
query=await async_maybe_transform({"task_id": task_id}, job_retrieve_params.JobRetrieveParams),
243+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
258244
),
259245
cast_to=EvaluateResponse,
260246
)
261247

262248
async def cancel(
263249
self,
264-
*,
265250
job_id: str,
251+
*,
266252
task_id: str,
267253
x_llama_stack_client_version: str | NotGiven = NOT_GIVEN,
268254
x_llama_stack_provider_data: str | NotGiven = NOT_GIVEN,
@@ -283,6 +269,10 @@ async def cancel(
283269
284270
timeout: Override the client-level default timeout for this request, in seconds
285271
"""
272+
if not task_id:
273+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
274+
if not job_id:
275+
raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}")
286276
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
287277
extra_headers = {
288278
**strip_not_given(
@@ -293,15 +283,8 @@ async def cancel(
293283
),
294284
**(extra_headers or {}),
295285
}
296-
return await self._post(
297-
"/v1/eval/jobs/cancel",
298-
body=await async_maybe_transform(
299-
{
300-
"job_id": job_id,
301-
"task_id": task_id,
302-
},
303-
job_cancel_params.JobCancelParams,
304-
),
286+
return await self._delete(
287+
f"/v1/eval/tasks/{task_id}/jobs/{job_id}",
305288
options=make_request_options(
306289
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
307290
),
@@ -332,6 +315,8 @@ async def status(
332315
333316
timeout: Override the client-level default timeout for this request, in seconds
334317
"""
318+
if not task_id:
319+
raise ValueError(f"Expected a non-empty value for `task_id` but received {task_id!r}")
335320
if not job_id:
336321
raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}")
337322
extra_headers = {
@@ -344,13 +329,9 @@ async def status(
344329
**(extra_headers or {}),
345330
}
346331
return await self._get(
347-
f"/v1/eval/jobs/{job_id}",
332+
f"/v1/eval/tasks/{task_id}/jobs/{job_id}",
348333
options=make_request_options(
349-
extra_headers=extra_headers,
350-
extra_query=extra_query,
351-
extra_body=extra_body,
352-
timeout=timeout,
353-
query=await async_maybe_transform({"task_id": task_id}, job_status_params.JobStatusParams),
334+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
354335
),
355336
cast_to=JobStatusResponse,
356337
)

src/llama_stack_client/resources/providers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def list(
7575
**(extra_headers or {}),
7676
}
7777
return self._get(
78-
"/v1/providers/list",
78+
"/v1/inspect/providers",
7979
options=make_request_options(
8080
extra_headers=extra_headers,
8181
extra_query=extra_query,
@@ -139,7 +139,7 @@ async def list(
139139
**(extra_headers or {}),
140140
}
141141
return await self._get(
142-
"/v1/providers/list",
142+
"/v1/inspect/providers",
143143
options=make_request_options(
144144
extra_headers=extra_headers,
145145
extra_query=extra_query,

0 commit comments

Comments
 (0)