Skip to content

Commit 1c68520

Browse files
feat(api): api update (#515)
1 parent d8127ce commit 1c68520

File tree

12 files changed

+342
-89
lines changed

12 files changed

+342
-89
lines changed

Diff for: .stats.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
configured_endpoints: 66
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-bf4f1f241c2a3a425dc7d12b7b7e415133bb696682d1a285836d1a36b7bd6160.yml
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-8030b5a782144e97b4c813649da362416bd258f9a0bdd5d43b507c474d7f0bc0.yml

Diff for: api.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ Methods:
2323

2424
- <code title="post /v1/benchmarks">client.benchmarks.<a href="./src/runloop_api_client/resources/benchmarks/benchmarks.py">create</a>(\*\*<a href="src/runloop_api_client/types/benchmark_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/benchmark_view.py">BenchmarkView</a></code>
2525
- <code title="get /v1/benchmarks/{id}">client.benchmarks.<a href="./src/runloop_api_client/resources/benchmarks/benchmarks.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/benchmark_view.py">BenchmarkView</a></code>
26-
- <code title="get /v1/benchmarks">client.benchmarks.<a href="./src/runloop_api_client/resources/benchmarks/benchmarks.py">list</a>(\*\*<a href="src/runloop_api_client/types/benchmark_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/benchmark_list_view.py">BenchmarkListView</a></code>
26+
- <code title="get /v1/benchmarks">client.benchmarks.<a href="./src/runloop_api_client/resources/benchmarks/benchmarks.py">list</a>(\*\*<a href="src/runloop_api_client/types/benchmark_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/benchmark_view.py">SyncBenchmarksCursorIDPage[BenchmarkView]</a></code>
2727
- <code title="post /v1/benchmarks/start_run">client.benchmarks.<a href="./src/runloop_api_client/resources/benchmarks/benchmarks.py">start_run</a>(\*\*<a href="src/runloop_api_client/types/benchmark_start_run_params.py">params</a>) -> <a href="./src/runloop_api_client/types/benchmark_run_view.py">BenchmarkRunView</a></code>
2828

2929
## Runs
3030

3131
Methods:
3232

3333
- <code title="get /v1/benchmarks/runs/{id}">client.benchmarks.runs.<a href="./src/runloop_api_client/resources/benchmarks/runs.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/benchmark_run_view.py">BenchmarkRunView</a></code>
34-
- <code title="get /v1/benchmarks/runs">client.benchmarks.runs.<a href="./src/runloop_api_client/resources/benchmarks/runs.py">list</a>(\*\*<a href="src/runloop_api_client/types/benchmarks/run_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/benchmark_run_list_view.py">BenchmarkRunListView</a></code>
34+
- <code title="get /v1/benchmarks/runs">client.benchmarks.runs.<a href="./src/runloop_api_client/resources/benchmarks/runs.py">list</a>(\*\*<a href="src/runloop_api_client/types/benchmarks/run_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/benchmark_run_view.py">SyncBenchmarkRunsCursorIDPage[BenchmarkRunView]</a></code>
3535
- <code title="post /v1/benchmarks/runs/{id}/complete">client.benchmarks.runs.<a href="./src/runloop_api_client/resources/benchmarks/runs.py">complete</a>(id) -> <a href="./src/runloop_api_client/types/benchmark_run_view.py">BenchmarkRunView</a></code>
3636

3737
# Blueprints
@@ -260,15 +260,15 @@ Methods:
260260

261261
- <code title="post /v1/scenarios">client.scenarios.<a href="./src/runloop_api_client/resources/scenarios/scenarios.py">create</a>(\*\*<a href="src/runloop_api_client/types/scenario_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenario_view.py">ScenarioView</a></code>
262262
- <code title="get /v1/scenarios/{id}">client.scenarios.<a href="./src/runloop_api_client/resources/scenarios/scenarios.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/scenario_view.py">ScenarioView</a></code>
263-
- <code title="get /v1/scenarios">client.scenarios.<a href="./src/runloop_api_client/resources/scenarios/scenarios.py">list</a>(\*\*<a href="src/runloop_api_client/types/scenario_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenario_list_view.py">ScenarioListView</a></code>
263+
- <code title="get /v1/scenarios">client.scenarios.<a href="./src/runloop_api_client/resources/scenarios/scenarios.py">list</a>(\*\*<a href="src/runloop_api_client/types/scenario_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenario_view.py">SyncScenariosCursorIDPage[ScenarioView]</a></code>
264264
- <code title="post /v1/scenarios/start_run">client.scenarios.<a href="./src/runloop_api_client/resources/scenarios/scenarios.py">start_run</a>(\*\*<a href="src/runloop_api_client/types/scenario_start_run_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenario_run_view.py">ScenarioRunView</a></code>
265265

266266
## Runs
267267

268268
Methods:
269269

270270
- <code title="get /v1/scenarios/runs/{id}">client.scenarios.runs.<a href="./src/runloop_api_client/resources/scenarios/runs.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/scenario_run_view.py">ScenarioRunView</a></code>
271-
- <code title="get /v1/scenarios/runs">client.scenarios.runs.<a href="./src/runloop_api_client/resources/scenarios/runs.py">list</a>(\*\*<a href="src/runloop_api_client/types/scenarios/run_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenario_run_list_view.py">ScenarioRunListView</a></code>
271+
- <code title="get /v1/scenarios/runs">client.scenarios.runs.<a href="./src/runloop_api_client/resources/scenarios/runs.py">list</a>(\*\*<a href="src/runloop_api_client/types/scenarios/run_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenario_run_view.py">SyncBenchmarkRunsCursorIDPage[ScenarioRunView]</a></code>
272272
- <code title="post /v1/scenarios/runs/{id}/complete">client.scenarios.runs.<a href="./src/runloop_api_client/resources/scenarios/runs.py">complete</a>(id) -> <a href="./src/runloop_api_client/types/scenario_run_view.py">ScenarioRunView</a></code>
273273
- <code title="post /v1/scenarios/runs/{id}/score">client.scenarios.runs.<a href="./src/runloop_api_client/resources/scenarios/runs.py">score</a>(id) -> <a href="./src/runloop_api_client/types/scenario_run_view.py">ScenarioRunView</a></code>
274274

Diff for: src/runloop_api_client/pagination.py

+236
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414
"AsyncRepositoriesCursorIDPage",
1515
"SyncDiskSnapshotsCursorIDPage",
1616
"AsyncDiskSnapshotsCursorIDPage",
17+
"SyncBenchmarksCursorIDPage",
18+
"AsyncBenchmarksCursorIDPage",
19+
"SyncBenchmarkRunsCursorIDPage",
20+
"AsyncBenchmarkRunsCursorIDPage",
21+
"SyncScenariosCursorIDPage",
22+
"AsyncScenariosCursorIDPage",
23+
"SyncScenarioRunsCursorIDPage",
24+
"AsyncScenarioRunsCursorIDPage",
1725
]
1826

1927
_T = TypeVar("_T")
@@ -39,6 +47,26 @@ class DiskSnapshotsCursorIDPageItem(Protocol):
3947
id: str
4048

4149

50+
@runtime_checkable
51+
class BenchmarksCursorIDPageItem(Protocol):
52+
id: str
53+
54+
55+
@runtime_checkable
56+
class BenchmarkRunsCursorIDPageItem(Protocol):
57+
id: str
58+
59+
60+
@runtime_checkable
61+
class ScenariosCursorIDPageItem(Protocol):
62+
id: str
63+
64+
65+
@runtime_checkable
66+
class ScenarioRunsCursorIDPageItem(Protocol):
67+
id: str
68+
69+
4270
class SyncBlueprintsCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
4371
blueprints: List[_T]
4472
has_more: Optional[bool] = None
@@ -245,3 +273,211 @@ def next_page_info(self) -> Optional[PageInfo]:
245273
return None
246274

247275
return PageInfo(params={"starting_after": item.id})
276+
277+
278+
class SyncBenchmarksCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
279+
benchmarks: List[_T]
280+
has_more: Optional[bool] = None
281+
total_count: Optional[int] = None
282+
283+
@override
284+
def _get_page_items(self) -> List[_T]:
285+
benchmarks = self.benchmarks
286+
if not benchmarks:
287+
return []
288+
return benchmarks
289+
290+
@override
291+
def next_page_info(self) -> Optional[PageInfo]:
292+
benchmarks = self.benchmarks
293+
if not benchmarks:
294+
return None
295+
296+
item = cast(Any, benchmarks[-1])
297+
if not isinstance(item, BenchmarksCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
298+
# TODO emit warning log
299+
return None
300+
301+
return PageInfo(params={"starting_after": item.id})
302+
303+
304+
class AsyncBenchmarksCursorIDPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
305+
benchmarks: List[_T]
306+
has_more: Optional[bool] = None
307+
total_count: Optional[int] = None
308+
309+
@override
310+
def _get_page_items(self) -> List[_T]:
311+
benchmarks = self.benchmarks
312+
if not benchmarks:
313+
return []
314+
return benchmarks
315+
316+
@override
317+
def next_page_info(self) -> Optional[PageInfo]:
318+
benchmarks = self.benchmarks
319+
if not benchmarks:
320+
return None
321+
322+
item = cast(Any, benchmarks[-1])
323+
if not isinstance(item, BenchmarksCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
324+
# TODO emit warning log
325+
return None
326+
327+
return PageInfo(params={"starting_after": item.id})
328+
329+
330+
class SyncBenchmarkRunsCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
331+
runs: List[_T]
332+
has_more: Optional[bool] = None
333+
total_count: Optional[int] = None
334+
335+
@override
336+
def _get_page_items(self) -> List[_T]:
337+
runs = self.runs
338+
if not runs:
339+
return []
340+
return runs
341+
342+
@override
343+
def next_page_info(self) -> Optional[PageInfo]:
344+
runs = self.runs
345+
if not runs:
346+
return None
347+
348+
item = cast(Any, runs[-1])
349+
if not isinstance(item, BenchmarkRunsCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
350+
# TODO emit warning log
351+
return None
352+
353+
return PageInfo(params={"starting_after": item.id})
354+
355+
356+
class AsyncBenchmarkRunsCursorIDPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
357+
runs: List[_T]
358+
has_more: Optional[bool] = None
359+
total_count: Optional[int] = None
360+
361+
@override
362+
def _get_page_items(self) -> List[_T]:
363+
runs = self.runs
364+
if not runs:
365+
return []
366+
return runs
367+
368+
@override
369+
def next_page_info(self) -> Optional[PageInfo]:
370+
runs = self.runs
371+
if not runs:
372+
return None
373+
374+
item = cast(Any, runs[-1])
375+
if not isinstance(item, BenchmarkRunsCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
376+
# TODO emit warning log
377+
return None
378+
379+
return PageInfo(params={"starting_after": item.id})
380+
381+
382+
class SyncScenariosCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
383+
scenarios: List[_T]
384+
has_more: Optional[bool] = None
385+
total_count: Optional[int] = None
386+
387+
@override
388+
def _get_page_items(self) -> List[_T]:
389+
scenarios = self.scenarios
390+
if not scenarios:
391+
return []
392+
return scenarios
393+
394+
@override
395+
def next_page_info(self) -> Optional[PageInfo]:
396+
scenarios = self.scenarios
397+
if not scenarios:
398+
return None
399+
400+
item = cast(Any, scenarios[-1])
401+
if not isinstance(item, ScenariosCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
402+
# TODO emit warning log
403+
return None
404+
405+
return PageInfo(params={"starting_after": item.id})
406+
407+
408+
class AsyncScenariosCursorIDPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
409+
scenarios: List[_T]
410+
has_more: Optional[bool] = None
411+
total_count: Optional[int] = None
412+
413+
@override
414+
def _get_page_items(self) -> List[_T]:
415+
scenarios = self.scenarios
416+
if not scenarios:
417+
return []
418+
return scenarios
419+
420+
@override
421+
def next_page_info(self) -> Optional[PageInfo]:
422+
scenarios = self.scenarios
423+
if not scenarios:
424+
return None
425+
426+
item = cast(Any, scenarios[-1])
427+
if not isinstance(item, ScenariosCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
428+
# TODO emit warning log
429+
return None
430+
431+
return PageInfo(params={"starting_after": item.id})
432+
433+
434+
class SyncScenarioRunsCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
435+
runs: List[_T]
436+
has_more: Optional[bool] = None
437+
total_count: Optional[int] = None
438+
439+
@override
440+
def _get_page_items(self) -> List[_T]:
441+
runs = self.runs
442+
if not runs:
443+
return []
444+
return runs
445+
446+
@override
447+
def next_page_info(self) -> Optional[PageInfo]:
448+
runs = self.runs
449+
if not runs:
450+
return None
451+
452+
item = cast(Any, runs[-1])
453+
if not isinstance(item, ScenarioRunsCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
454+
# TODO emit warning log
455+
return None
456+
457+
return PageInfo(params={"starting_after": item.id})
458+
459+
460+
class AsyncScenarioRunsCursorIDPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
461+
runs: List[_T]
462+
has_more: Optional[bool] = None
463+
total_count: Optional[int] = None
464+
465+
@override
466+
def _get_page_items(self) -> List[_T]:
467+
runs = self.runs
468+
if not runs:
469+
return []
470+
return runs
471+
472+
@override
473+
def next_page_info(self) -> Optional[PageInfo]:
474+
runs = self.runs
475+
if not runs:
476+
return None
477+
478+
item = cast(Any, runs[-1])
479+
if not isinstance(item, ScenarioRunsCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
480+
# TODO emit warning log
481+
return None
482+
483+
return PageInfo(params={"starting_after": item.id})

Diff for: src/runloop_api_client/resources/benchmarks/benchmarks.py

+12-10
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@
2828
async_to_raw_response_wrapper,
2929
async_to_streamed_response_wrapper,
3030
)
31-
from ..._base_client import make_request_options
31+
from ...pagination import SyncBenchmarksCursorIDPage, AsyncBenchmarksCursorIDPage
32+
from ..._base_client import AsyncPaginator, make_request_options
3233
from ...types.benchmark_view import BenchmarkView
3334
from ...types.benchmark_run_view import BenchmarkRunView
34-
from ...types.benchmark_list_view import BenchmarkListView
3535

3636
__all__ = ["BenchmarksResource", "AsyncBenchmarksResource"]
3737

@@ -155,7 +155,7 @@ def list(
155155
extra_query: Query | None = None,
156156
extra_body: Body | None = None,
157157
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
158-
) -> BenchmarkListView:
158+
) -> SyncBenchmarksCursorIDPage[BenchmarkView]:
159159
"""
160160
List all Benchmarks matching filter.
161161
@@ -175,8 +175,9 @@ def list(
175175
176176
timeout: Override the client-level default timeout for this request, in seconds
177177
"""
178-
return self._get(
178+
return self._get_api_list(
179179
"/v1/benchmarks",
180+
page=SyncBenchmarksCursorIDPage[BenchmarkView],
180181
options=make_request_options(
181182
extra_headers=extra_headers,
182183
extra_query=extra_query,
@@ -191,7 +192,7 @@ def list(
191192
benchmark_list_params.BenchmarkListParams,
192193
),
193194
),
194-
cast_to=BenchmarkListView,
195+
model=BenchmarkView,
195196
)
196197

197198
def start_run(
@@ -352,7 +353,7 @@ async def retrieve(
352353
cast_to=BenchmarkView,
353354
)
354355

355-
async def list(
356+
def list(
356357
self,
357358
*,
358359
limit: int | NotGiven = NOT_GIVEN,
@@ -364,7 +365,7 @@ async def list(
364365
extra_query: Query | None = None,
365366
extra_body: Body | None = None,
366367
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
367-
) -> BenchmarkListView:
368+
) -> AsyncPaginator[BenchmarkView, AsyncBenchmarksCursorIDPage[BenchmarkView]]:
368369
"""
369370
List all Benchmarks matching filter.
370371
@@ -384,14 +385,15 @@ async def list(
384385
385386
timeout: Override the client-level default timeout for this request, in seconds
386387
"""
387-
return await self._get(
388+
return self._get_api_list(
388389
"/v1/benchmarks",
390+
page=AsyncBenchmarksCursorIDPage[BenchmarkView],
389391
options=make_request_options(
390392
extra_headers=extra_headers,
391393
extra_query=extra_query,
392394
extra_body=extra_body,
393395
timeout=timeout,
394-
query=await async_maybe_transform(
396+
query=maybe_transform(
395397
{
396398
"limit": limit,
397399
"public": public,
@@ -400,7 +402,7 @@ async def list(
400402
benchmark_list_params.BenchmarkListParams,
401403
),
402404
),
403-
cast_to=BenchmarkListView,
405+
model=BenchmarkView,
404406
)
405407

406408
async def start_run(

0 commit comments

Comments
 (0)