Skip to content

Commit 5857623

Browse files
feat(api): update via SDK Studio
1 parent cb9a7a9 commit 5857623

69 files changed

Lines changed: 4098 additions & 221 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
name: CI
2+
on:
3+
pull_request:
4+
branches:
5+
- main
6+
- next
7+
8+
jobs:
9+
detect_breaking_changes:
10+
runs-on: 'ubuntu-latest'
11+
name: detect-breaking-changes
12+
if: github.repository == 'parallel-web/parallel-sdk-python'
13+
steps:
14+
- name: Calculate fetch-depth
15+
run: |
16+
echo "FETCH_DEPTH=$(expr ${{ github.event.pull_request.commits }} + 1)" >> $GITHUB_ENV
17+
18+
- uses: actions/checkout@v4
19+
with:
20+
# Ensure we can check out the pull request base in the script below.
21+
fetch-depth: ${{ env.FETCH_DEPTH }}
22+
23+
- name: Install Rye
24+
run: |
25+
curl -sSf https://rye.astral.sh/get | bash
26+
echo "$HOME/.rye/shims" >> $GITHUB_PATH
27+
env:
28+
RYE_VERSION: '0.44.0'
29+
RYE_INSTALL_OPTION: '--yes'
30+
- name: Install dependencies
31+
run: |
32+
rye sync --all-features
33+
- name: Detect removed symbols
34+
run: |
35+
rye run python scripts/detect-breaking-changes.py "${{ github.event.pull_request.base.sha }}"
36+
37+
- name: Detect breaking changes
38+
run: |
39+
# Try to check out previous versions of the breaking change detection script. This ensures that
40+
# we still detect breaking changes when entire files and their tests are removed.
41+
git checkout "${{ github.event.pull_request.base.sha }}" -- ./scripts/detect-breaking-changes 2>/dev/null || true
42+
./scripts/detect-breaking-changes ${{ github.event.pull_request.base.sha }}

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 3
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/parallel-web%2Fparallel-sdk-ff0d5939e135b67b3448abf72d8bb0f9a574194337c7c7192453781347a9601d.yml
3-
openapi_spec_hash: f3ce85349af6273a671d3d2781c4c877
4-
config_hash: 95578fd0fb46916a9ee6b87857ee6683
1+
configured_endpoints: 12
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/parallel-web%2Fparallel-sdk-1aeb1c81a84999f2d27ca9e86b041d74b892926bed126dc9b0f3cff4d7b26963.yml
3+
openapi_spec_hash: 6280f6c6fb537f7c9ac5cc33ee2e433d
4+
config_hash: 284b51e02bda8519b1f21bb67f1809e0

api.md

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
1+
# Shared Types
2+
3+
```python
4+
from parallel.types import ErrorObject, ErrorResponse, SourcePolicy, Warning
5+
```
6+
17
# TaskRun
28

39
Types:
410

511
```python
6-
from parallel.types import Input, JsonSchema, ParsedTaskRunResult, TaskRun, TaskRunResult, TaskSpec, TextSchema
12+
from parallel.types import (
13+
AutoSchema,
14+
Citation,
15+
FieldBasis,
16+
JsonSchema, ParsedTaskRunResult, RunInput,
17+
TaskRun,
18+
TaskRunJsonOutput,
19+
TaskRunResult,
20+
TaskRunTextOutput,
21+
TaskSpec,
22+
TextSchema,
23+
)
724
```
825

926
Methods:
@@ -16,3 +33,60 @@ Convenience methods:
1633

1734
- <code title="post /v1/tasks/runs">client.task_run.<a href="./src/parallel/resources/task_run.py">execute</a>(input, processor, output: <a href="./src/parallel/types/task_spec_param.py">OutputSchema</a>) -> <a href="./src/parallel/types/task_run_result.py">TaskRunResult</a></code>
1835
- <code title="post /v1/tasks/runs">client.task_run.<a href="./src/parallel/resources/task_run.py">execute</a>(input, processor, output: Type[OutputT]) -> <a href="./src/parallel/types/parsed_task_run_result.py">ParsedTaskRunResult[OutputT]</a></code>
36+
# Beta
37+
38+
Types:
39+
40+
```python
41+
from parallel.types.beta import SearchResult, WebSearchResult
42+
```
43+
44+
Methods:
45+
46+
- <code title="post /v1beta/search">client.beta.<a href="./src/parallel/resources/beta/beta.py">search</a>(\*\*<a href="src/parallel/types/beta/beta_search_params.py">params</a>) -> <a href="./src/parallel/types/beta/search_result.py">SearchResult</a></code>
47+
48+
## TaskRun
49+
50+
Types:
51+
52+
```python
53+
from parallel.types.beta import (
54+
BetaRunInput,
55+
BetaTaskRunResult,
56+
ErrorEvent,
57+
McpServer,
58+
McpToolCall,
59+
ParallelBeta,
60+
TaskRunEvent,
61+
Webhook,
62+
TaskRunEventsResponse,
63+
)
64+
```
65+
66+
Methods:
67+
68+
- <code title="post /v1/tasks/runs?beta=true">client.beta.task_run.<a href="./src/parallel/resources/beta/task_run.py">create</a>(\*\*<a href="src/parallel/types/beta/task_run_create_params.py">params</a>) -> <a href="./src/parallel/types/task_run.py">TaskRun</a></code>
69+
- <code title="get /v1beta/tasks/runs/{run_id}/events">client.beta.task_run.<a href="./src/parallel/resources/beta/task_run.py">events</a>(run_id) -> <a href="./src/parallel/types/beta/task_run_events_response.py">TaskRunEventsResponse</a></code>
70+
- <code title="get /v1/tasks/runs/{run_id}/result?beta=true">client.beta.task_run.<a href="./src/parallel/resources/beta/task_run.py">result</a>(run_id, \*\*<a href="src/parallel/types/beta/task_run_result_params.py">params</a>) -> <a href="./src/parallel/types/beta/beta_task_run_result.py">BetaTaskRunResult</a></code>
71+
72+
## TaskGroup
73+
74+
Types:
75+
76+
```python
77+
from parallel.types.beta import (
78+
TaskGroup,
79+
TaskGroupRunResponse,
80+
TaskGroupStatus,
81+
TaskGroupEventsResponse,
82+
TaskGroupGetRunsResponse,
83+
)
84+
```
85+
86+
Methods:
87+
88+
- <code title="post /v1beta/tasks/groups">client.beta.task_group.<a href="./src/parallel/resources/beta/task_group.py">create</a>(\*\*<a href="src/parallel/types/beta/task_group_create_params.py">params</a>) -> <a href="./src/parallel/types/beta/task_group.py">TaskGroup</a></code>
89+
- <code title="get /v1beta/tasks/groups/{taskgroup_id}">client.beta.task_group.<a href="./src/parallel/resources/beta/task_group.py">retrieve</a>(task_group_id) -> <a href="./src/parallel/types/beta/task_group.py">TaskGroup</a></code>
90+
- <code title="post /v1beta/tasks/groups/{taskgroup_id}/runs">client.beta.task_group.<a href="./src/parallel/resources/beta/task_group.py">add_runs</a>(task_group_id, \*\*<a href="src/parallel/types/beta/task_group_add_runs_params.py">params</a>) -> <a href="./src/parallel/types/beta/task_group_run_response.py">TaskGroupRunResponse</a></code>
91+
- <code title="get /v1beta/tasks/groups/{taskgroup_id}/events">client.beta.task_group.<a href="./src/parallel/resources/beta/task_group.py">events</a>(task_group_id, \*\*<a href="src/parallel/types/beta/task_group_events_params.py">params</a>) -> <a href="./src/parallel/types/beta/task_group_events_response.py">TaskGroupEventsResponse</a></code>
92+
- <code title="get /v1beta/tasks/groups/{taskgroup_id}/runs">client.beta.task_group.<a href="./src/parallel/resources/beta/task_group.py">get_runs</a>(task_group_id, \*\*<a href="src/parallel/types/beta/task_group_get_runs_params.py">params</a>) -> <a href="./src/parallel/types/beta/task_group_get_runs_response.py">TaskGroupGetRunsResponse</a></code>

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ dev-dependencies = [
5858
"rich>=13.7.1",
5959
"nest_asyncio==1.6.0",
6060
"pytest-xdist>=3.6.1",
61+
"griffe>=1",
6162
]
6263

6364
[tool.rye.scripts]

requirements-dev.lock

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ attrs==25.3.0
3131
certifi==2023.7.22
3232
# via httpcore
3333
# via httpx
34+
colorama==0.4.6
35+
# via griffe
3436
colorlog==6.7.0
3537
# via nox
3638
dirty-equals==0.6.0
@@ -48,6 +50,7 @@ filelock==3.12.4
4850
frozenlist==1.6.2
4951
# via aiohttp
5052
# via aiosignal
53+
griffe==1.13.0
5154
h11==0.16.0
5255
# via httpcore
5356
httpcore==1.0.9

scripts/detect-breaking-changes

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
cd "$(dirname "$0")/.."
6+
7+
echo "==> Detecting breaking changes"
8+
9+
TEST_PATHS=( tests/api_resources tests/test_client.py tests/test_response.py )
10+
11+
for PATHSPEC in "${TEST_PATHS[@]}"; do
12+
# Try to check out previous versions of the test files
13+
# with the current SDK.
14+
git checkout "$1" -- "${PATHSPEC}" 2>/dev/null || true
15+
done
16+
17+
# Instead of running the tests, use the linter to check if an
18+
# older test is no longer compatible with the latest SDK.
19+
./scripts/lint

scripts/detect-breaking-changes.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
from __future__ import annotations
2+
3+
import sys
4+
from typing import Iterator
5+
from pathlib import Path
6+
7+
import rich
8+
import griffe
9+
from rich.text import Text
10+
from rich.style import Style
11+
12+
13+
def public_members(obj: griffe.Object | griffe.Alias) -> dict[str, griffe.Object | griffe.Alias]:
14+
if isinstance(obj, griffe.Alias):
15+
# ignore imports for now, they're technically part of the public API
16+
# but we don't have good preventative measures in place to prevent
17+
# changing them
18+
return {}
19+
20+
return {name: value for name, value in obj.all_members.items() if not name.startswith("_")}
21+
22+
23+
def find_breaking_changes(
24+
new_obj: griffe.Object | griffe.Alias,
25+
old_obj: griffe.Object | griffe.Alias,
26+
*,
27+
path: list[str],
28+
) -> Iterator[Text | str]:
29+
new_members = public_members(new_obj)
30+
old_members = public_members(old_obj)
31+
32+
for name, old_member in old_members.items():
33+
if isinstance(old_member, griffe.Alias) and len(path) > 2:
34+
# ignore imports in `/types/` for now, they're technically part of the public API
35+
# but we don't have good preventative measures in place to prevent changing them
36+
continue
37+
38+
new_member = new_members.get(name)
39+
if new_member is None:
40+
cls_name = old_member.__class__.__name__
41+
yield Text(f"({cls_name})", style=Style(color="rgb(119, 119, 119)"))
42+
yield from [" " for _ in range(10 - len(cls_name))]
43+
yield f" {'.'.join(path)}.{name}"
44+
yield "\n"
45+
continue
46+
47+
yield from find_breaking_changes(new_member, old_member, path=[*path, name])
48+
49+
50+
def main() -> None:
51+
try:
52+
against_ref = sys.argv[1]
53+
except IndexError as err:
54+
raise RuntimeError("You must specify a base ref to run breaking change detection against") from err
55+
56+
package = griffe.load(
57+
"parallel",
58+
search_paths=[Path(__file__).parent.parent.joinpath("src")],
59+
)
60+
old_package = griffe.load_git(
61+
"parallel",
62+
ref=against_ref,
63+
search_paths=["src"],
64+
)
65+
assert isinstance(package, griffe.Module)
66+
assert isinstance(old_package, griffe.Module)
67+
68+
output = list(find_breaking_changes(package, old_package, path=["parallel"]))
69+
if output:
70+
rich.print(Text("Breaking changes detected!", style=Style(color="rgb(165, 79, 87)")))
71+
rich.print()
72+
73+
for text in output:
74+
rich.print(text, end="")
75+
76+
sys.exit(1)
77+
78+
79+
main()

src/parallel/_client.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
SyncAPIClient,
3030
AsyncAPIClient,
3131
)
32+
from .resources.beta import beta
3233

3334
__all__ = [
3435
"Timeout",
@@ -44,6 +45,7 @@
4445

4546
class Parallel(SyncAPIClient):
4647
task_run: task_run.TaskRunResource
48+
beta: beta.BetaResource
4749
with_raw_response: ParallelWithRawResponse
4850
with_streaming_response: ParallelWithStreamedResponse
4951

@@ -102,6 +104,7 @@ def __init__(
102104
)
103105

104106
self.task_run = task_run.TaskRunResource(self)
107+
self.beta = beta.BetaResource(self)
105108
self.with_raw_response = ParallelWithRawResponse(self)
106109
self.with_streaming_response = ParallelWithStreamedResponse(self)
107110

@@ -212,6 +215,7 @@ def _make_status_error(
212215

213216
class AsyncParallel(AsyncAPIClient):
214217
task_run: task_run.AsyncTaskRunResource
218+
beta: beta.AsyncBetaResource
215219
with_raw_response: AsyncParallelWithRawResponse
216220
with_streaming_response: AsyncParallelWithStreamedResponse
217221

@@ -270,6 +274,7 @@ def __init__(
270274
)
271275

272276
self.task_run = task_run.AsyncTaskRunResource(self)
277+
self.beta = beta.AsyncBetaResource(self)
273278
self.with_raw_response = AsyncParallelWithRawResponse(self)
274279
self.with_streaming_response = AsyncParallelWithStreamedResponse(self)
275280

@@ -381,21 +386,25 @@ def _make_status_error(
381386
class ParallelWithRawResponse:
382387
def __init__(self, client: Parallel) -> None:
383388
self.task_run = task_run.TaskRunResourceWithRawResponse(client.task_run)
389+
self.beta = beta.BetaResourceWithRawResponse(client.beta)
384390

385391

386392
class AsyncParallelWithRawResponse:
387393
def __init__(self, client: AsyncParallel) -> None:
388394
self.task_run = task_run.AsyncTaskRunResourceWithRawResponse(client.task_run)
395+
self.beta = beta.AsyncBetaResourceWithRawResponse(client.beta)
389396

390397

391398
class ParallelWithStreamedResponse:
392399
def __init__(self, client: Parallel) -> None:
393400
self.task_run = task_run.TaskRunResourceWithStreamingResponse(client.task_run)
401+
self.beta = beta.BetaResourceWithStreamingResponse(client.beta)
394402

395403

396404
class AsyncParallelWithStreamedResponse:
397405
def __init__(self, client: AsyncParallel) -> None:
398406
self.task_run = task_run.AsyncTaskRunResourceWithStreamingResponse(client.task_run)
407+
self.beta = beta.AsyncBetaResourceWithStreamingResponse(client.beta)
399408

400409

401410
Client = Parallel

src/parallel/resources/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3+
from .beta import (
4+
BetaResource,
5+
AsyncBetaResource,
6+
BetaResourceWithRawResponse,
7+
AsyncBetaResourceWithRawResponse,
8+
BetaResourceWithStreamingResponse,
9+
AsyncBetaResourceWithStreamingResponse,
10+
)
311
from .task_run import (
412
TaskRunResource,
513
AsyncTaskRunResource,
@@ -16,4 +24,10 @@
1624
"AsyncTaskRunResourceWithRawResponse",
1725
"TaskRunResourceWithStreamingResponse",
1826
"AsyncTaskRunResourceWithStreamingResponse",
27+
"BetaResource",
28+
"AsyncBetaResource",
29+
"BetaResourceWithRawResponse",
30+
"AsyncBetaResourceWithRawResponse",
31+
"BetaResourceWithStreamingResponse",
32+
"AsyncBetaResourceWithStreamingResponse",
1933
]

0 commit comments

Comments
 (0)