parallel-web 0.1.3__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of parallel-web might be problematic. Click here for more details.
- parallel/__init__.py +2 -1
- parallel/_base_client.py +37 -5
- parallel/_client.py +9 -0
- parallel/_compat.py +55 -54
- parallel/_files.py +4 -4
- parallel/_models.py +70 -46
- parallel/_types.py +35 -1
- parallel/_utils/__init__.py +9 -2
- parallel/_utils/_compat.py +45 -0
- parallel/_utils/_datetime_parse.py +136 -0
- parallel/_utils/_transform.py +11 -1
- parallel/_utils/_typing.py +6 -1
- parallel/_utils/_utils.py +0 -1
- parallel/_version.py +1 -1
- parallel/lib/_pydantic.py +4 -3
- parallel/resources/__init__.py +14 -0
- parallel/resources/beta/__init__.py +47 -0
- parallel/resources/beta/beta.py +301 -0
- parallel/resources/beta/task_group.py +632 -0
- parallel/resources/beta/task_run.py +499 -0
- parallel/resources/task_run.py +47 -18
- parallel/types/__init__.py +15 -0
- parallel/types/auto_schema.py +13 -0
- parallel/types/auto_schema_param.py +12 -0
- parallel/types/beta/__init__.py +30 -0
- parallel/types/beta/beta_run_input.py +63 -0
- parallel/types/beta/beta_run_input_param.py +65 -0
- parallel/types/beta/beta_search_params.py +48 -0
- parallel/types/beta/beta_task_run_result.py +74 -0
- parallel/types/beta/error_event.py +16 -0
- parallel/types/beta/mcp_server.py +25 -0
- parallel/types/beta/mcp_server_param.py +27 -0
- parallel/types/beta/mcp_tool_call.py +27 -0
- parallel/types/beta/parallel_beta_param.py +12 -0
- parallel/types/beta/search_result.py +16 -0
- parallel/types/beta/task_group.py +24 -0
- parallel/types/beta/task_group_add_runs_params.py +30 -0
- parallel/types/beta/task_group_create_params.py +13 -0
- parallel/types/beta/task_group_events_params.py +16 -0
- parallel/types/beta/task_group_events_response.py +28 -0
- parallel/types/beta/task_group_get_runs_params.py +18 -0
- parallel/types/beta/task_group_get_runs_response.py +12 -0
- parallel/types/beta/task_group_run_response.py +30 -0
- parallel/types/beta/task_group_status.py +27 -0
- parallel/types/beta/task_run_create_params.py +70 -0
- parallel/types/beta/task_run_event.py +32 -0
- parallel/types/beta/task_run_events_response.py +58 -0
- parallel/types/beta/task_run_result_params.py +18 -0
- parallel/types/beta/web_search_result.py +18 -0
- parallel/types/beta/webhook.py +16 -0
- parallel/types/beta/webhook_param.py +16 -0
- parallel/types/citation.py +21 -0
- parallel/types/field_basis.py +25 -0
- parallel/types/json_schema.py +16 -0
- parallel/types/json_schema_param.py +2 -1
- parallel/types/parsed_task_run_result.py +13 -4
- parallel/types/shared/__init__.py +6 -0
- parallel/types/shared/error_object.py +18 -0
- parallel/types/shared/error_response.py +16 -0
- parallel/types/shared/source_policy.py +21 -0
- parallel/types/shared/warning.py +22 -0
- parallel/types/shared_params/__init__.py +3 -0
- parallel/types/shared_params/source_policy.py +23 -0
- parallel/types/task_run.py +17 -18
- parallel/types/task_run_create_params.py +12 -3
- parallel/types/task_run_json_output.py +46 -0
- parallel/types/task_run_result.py +24 -94
- parallel/types/task_run_text_output.py +37 -0
- parallel/types/task_spec.py +31 -0
- parallel/types/task_spec_param.py +3 -2
- parallel/types/text_schema.py +16 -0
- parallel/types/text_schema_param.py +3 -2
- {parallel_web-0.1.3.dist-info → parallel_web-0.2.1.dist-info}/METADATA +23 -159
- parallel_web-0.2.1.dist-info/RECORD +96 -0
- parallel_web-0.1.3.dist-info/RECORD +0 -47
- {parallel_web-0.1.3.dist-info → parallel_web-0.2.1.dist-info}/WHEEL +0 -0
- {parallel_web-0.1.3.dist-info → parallel_web-0.2.1.dist-info}/licenses/LICENSE +0 -0
parallel/_types.py
CHANGED
|
@@ -13,10 +13,21 @@ from typing import (
|
|
|
13
13
|
Mapping,
|
|
14
14
|
TypeVar,
|
|
15
15
|
Callable,
|
|
16
|
+
Iterator,
|
|
16
17
|
Optional,
|
|
17
18
|
Sequence,
|
|
18
19
|
)
|
|
19
|
-
from typing_extensions import
|
|
20
|
+
from typing_extensions import (
|
|
21
|
+
Set,
|
|
22
|
+
Literal,
|
|
23
|
+
Protocol,
|
|
24
|
+
TypeAlias,
|
|
25
|
+
TypedDict,
|
|
26
|
+
SupportsIndex,
|
|
27
|
+
overload,
|
|
28
|
+
override,
|
|
29
|
+
runtime_checkable,
|
|
30
|
+
)
|
|
20
31
|
|
|
21
32
|
import httpx
|
|
22
33
|
import pydantic
|
|
@@ -217,3 +228,26 @@ class _GenericAlias(Protocol):
|
|
|
217
228
|
class HttpxSendArgs(TypedDict, total=False):
|
|
218
229
|
auth: httpx.Auth
|
|
219
230
|
follow_redirects: bool
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
_T_co = TypeVar("_T_co", covariant=True)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
if TYPE_CHECKING:
|
|
237
|
+
# This works because str.__contains__ does not accept object (either in typeshed or at runtime)
|
|
238
|
+
# https://github.com/hauntsaninja/useful_types/blob/5e9710f3875107d068e7679fd7fec9cfab0eff3b/useful_types/__init__.py#L285
|
|
239
|
+
class SequenceNotStr(Protocol[_T_co]):
|
|
240
|
+
@overload
|
|
241
|
+
def __getitem__(self, index: SupportsIndex, /) -> _T_co: ...
|
|
242
|
+
@overload
|
|
243
|
+
def __getitem__(self, index: slice, /) -> Sequence[_T_co]: ...
|
|
244
|
+
def __contains__(self, value: object, /) -> bool: ...
|
|
245
|
+
def __len__(self) -> int: ...
|
|
246
|
+
def __iter__(self) -> Iterator[_T_co]: ...
|
|
247
|
+
def index(self, value: Any, start: int = 0, stop: int = ..., /) -> int: ...
|
|
248
|
+
def count(self, value: Any, /) -> int: ...
|
|
249
|
+
def __reversed__(self) -> Iterator[_T_co]: ...
|
|
250
|
+
else:
|
|
251
|
+
# just point this to a normal `Sequence` at runtime to avoid having to special case
|
|
252
|
+
# deserializing our custom sequence type
|
|
253
|
+
SequenceNotStr = Sequence
|
parallel/_utils/__init__.py
CHANGED
|
@@ -11,7 +11,6 @@ from ._utils import (
|
|
|
11
11
|
lru_cache as lru_cache,
|
|
12
12
|
is_mapping as is_mapping,
|
|
13
13
|
is_tuple_t as is_tuple_t,
|
|
14
|
-
parse_date as parse_date,
|
|
15
14
|
is_iterable as is_iterable,
|
|
16
15
|
is_sequence as is_sequence,
|
|
17
16
|
coerce_float as coerce_float,
|
|
@@ -24,7 +23,6 @@ from ._utils import (
|
|
|
24
23
|
coerce_boolean as coerce_boolean,
|
|
25
24
|
coerce_integer as coerce_integer,
|
|
26
25
|
file_from_path as file_from_path,
|
|
27
|
-
parse_datetime as parse_datetime,
|
|
28
26
|
strip_not_given as strip_not_given,
|
|
29
27
|
deepcopy_minimal as deepcopy_minimal,
|
|
30
28
|
get_async_library as get_async_library,
|
|
@@ -33,12 +31,20 @@ from ._utils import (
|
|
|
33
31
|
maybe_coerce_boolean as maybe_coerce_boolean,
|
|
34
32
|
maybe_coerce_integer as maybe_coerce_integer,
|
|
35
33
|
)
|
|
34
|
+
from ._compat import (
|
|
35
|
+
get_args as get_args,
|
|
36
|
+
is_union as is_union,
|
|
37
|
+
get_origin as get_origin,
|
|
38
|
+
is_typeddict as is_typeddict,
|
|
39
|
+
is_literal_type as is_literal_type,
|
|
40
|
+
)
|
|
36
41
|
from ._typing import (
|
|
37
42
|
is_list_type as is_list_type,
|
|
38
43
|
is_union_type as is_union_type,
|
|
39
44
|
extract_type_arg as extract_type_arg,
|
|
40
45
|
is_iterable_type as is_iterable_type,
|
|
41
46
|
is_required_type as is_required_type,
|
|
47
|
+
is_sequence_type as is_sequence_type,
|
|
42
48
|
is_annotated_type as is_annotated_type,
|
|
43
49
|
is_type_alias_type as is_type_alias_type,
|
|
44
50
|
strip_annotated_type as strip_annotated_type,
|
|
@@ -56,3 +62,4 @@ from ._reflection import (
|
|
|
56
62
|
function_has_argument as function_has_argument,
|
|
57
63
|
assert_signatures_in_sync as assert_signatures_in_sync,
|
|
58
64
|
)
|
|
65
|
+
from ._datetime_parse import parse_date as parse_date, parse_datetime as parse_datetime
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
import typing_extensions
|
|
5
|
+
from typing import Any, Type, Union, Literal, Optional
|
|
6
|
+
from datetime import date, datetime
|
|
7
|
+
from typing_extensions import get_args as _get_args, get_origin as _get_origin
|
|
8
|
+
|
|
9
|
+
from .._types import StrBytesIntFloat
|
|
10
|
+
from ._datetime_parse import parse_date as _parse_date, parse_datetime as _parse_datetime
|
|
11
|
+
|
|
12
|
+
_LITERAL_TYPES = {Literal, typing_extensions.Literal}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_args(tp: type[Any]) -> tuple[Any, ...]:
|
|
16
|
+
return _get_args(tp)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_origin(tp: type[Any]) -> type[Any] | None:
|
|
20
|
+
return _get_origin(tp)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def is_union(tp: Optional[Type[Any]]) -> bool:
|
|
24
|
+
if sys.version_info < (3, 10):
|
|
25
|
+
return tp is Union # type: ignore[comparison-overlap]
|
|
26
|
+
else:
|
|
27
|
+
import types
|
|
28
|
+
|
|
29
|
+
return tp is Union or tp is types.UnionType
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def is_typeddict(tp: Type[Any]) -> bool:
|
|
33
|
+
return typing_extensions.is_typeddict(tp)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def is_literal_type(tp: Type[Any]) -> bool:
|
|
37
|
+
return get_origin(tp) in _LITERAL_TYPES
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def parse_date(value: Union[date, StrBytesIntFloat]) -> date:
|
|
41
|
+
return _parse_date(value)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def parse_datetime(value: Union[datetime, StrBytesIntFloat]) -> datetime:
|
|
45
|
+
return _parse_datetime(value)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This file contains code from https://github.com/pydantic/pydantic/blob/main/pydantic/v1/datetime_parse.py
|
|
3
|
+
without the Pydantic v1 specific errors.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import re
|
|
9
|
+
from typing import Dict, Union, Optional
|
|
10
|
+
from datetime import date, datetime, timezone, timedelta
|
|
11
|
+
|
|
12
|
+
from .._types import StrBytesIntFloat
|
|
13
|
+
|
|
14
|
+
date_expr = r"(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})"
|
|
15
|
+
time_expr = (
|
|
16
|
+
r"(?P<hour>\d{1,2}):(?P<minute>\d{1,2})"
|
|
17
|
+
r"(?::(?P<second>\d{1,2})(?:\.(?P<microsecond>\d{1,6})\d{0,6})?)?"
|
|
18
|
+
r"(?P<tzinfo>Z|[+-]\d{2}(?::?\d{2})?)?$"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
date_re = re.compile(f"{date_expr}$")
|
|
22
|
+
datetime_re = re.compile(f"{date_expr}[T ]{time_expr}")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
EPOCH = datetime(1970, 1, 1)
|
|
26
|
+
# if greater than this, the number is in ms, if less than or equal it's in seconds
|
|
27
|
+
# (in seconds this is 11th October 2603, in ms it's 20th August 1970)
|
|
28
|
+
MS_WATERSHED = int(2e10)
|
|
29
|
+
# slightly more than datetime.max in ns - (datetime.max - EPOCH).total_seconds() * 1e9
|
|
30
|
+
MAX_NUMBER = int(3e20)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _get_numeric(value: StrBytesIntFloat, native_expected_type: str) -> Union[None, int, float]:
|
|
34
|
+
if isinstance(value, (int, float)):
|
|
35
|
+
return value
|
|
36
|
+
try:
|
|
37
|
+
return float(value)
|
|
38
|
+
except ValueError:
|
|
39
|
+
return None
|
|
40
|
+
except TypeError:
|
|
41
|
+
raise TypeError(f"invalid type; expected {native_expected_type}, string, bytes, int or float") from None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _from_unix_seconds(seconds: Union[int, float]) -> datetime:
|
|
45
|
+
if seconds > MAX_NUMBER:
|
|
46
|
+
return datetime.max
|
|
47
|
+
elif seconds < -MAX_NUMBER:
|
|
48
|
+
return datetime.min
|
|
49
|
+
|
|
50
|
+
while abs(seconds) > MS_WATERSHED:
|
|
51
|
+
seconds /= 1000
|
|
52
|
+
dt = EPOCH + timedelta(seconds=seconds)
|
|
53
|
+
return dt.replace(tzinfo=timezone.utc)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _parse_timezone(value: Optional[str]) -> Union[None, int, timezone]:
|
|
57
|
+
if value == "Z":
|
|
58
|
+
return timezone.utc
|
|
59
|
+
elif value is not None:
|
|
60
|
+
offset_mins = int(value[-2:]) if len(value) > 3 else 0
|
|
61
|
+
offset = 60 * int(value[1:3]) + offset_mins
|
|
62
|
+
if value[0] == "-":
|
|
63
|
+
offset = -offset
|
|
64
|
+
return timezone(timedelta(minutes=offset))
|
|
65
|
+
else:
|
|
66
|
+
return None
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def parse_datetime(value: Union[datetime, StrBytesIntFloat]) -> datetime:
|
|
70
|
+
"""
|
|
71
|
+
Parse a datetime/int/float/string and return a datetime.datetime.
|
|
72
|
+
|
|
73
|
+
This function supports time zone offsets. When the input contains one,
|
|
74
|
+
the output uses a timezone with a fixed offset from UTC.
|
|
75
|
+
|
|
76
|
+
Raise ValueError if the input is well formatted but not a valid datetime.
|
|
77
|
+
Raise ValueError if the input isn't well formatted.
|
|
78
|
+
"""
|
|
79
|
+
if isinstance(value, datetime):
|
|
80
|
+
return value
|
|
81
|
+
|
|
82
|
+
number = _get_numeric(value, "datetime")
|
|
83
|
+
if number is not None:
|
|
84
|
+
return _from_unix_seconds(number)
|
|
85
|
+
|
|
86
|
+
if isinstance(value, bytes):
|
|
87
|
+
value = value.decode()
|
|
88
|
+
|
|
89
|
+
assert not isinstance(value, (float, int))
|
|
90
|
+
|
|
91
|
+
match = datetime_re.match(value)
|
|
92
|
+
if match is None:
|
|
93
|
+
raise ValueError("invalid datetime format")
|
|
94
|
+
|
|
95
|
+
kw = match.groupdict()
|
|
96
|
+
if kw["microsecond"]:
|
|
97
|
+
kw["microsecond"] = kw["microsecond"].ljust(6, "0")
|
|
98
|
+
|
|
99
|
+
tzinfo = _parse_timezone(kw.pop("tzinfo"))
|
|
100
|
+
kw_: Dict[str, Union[None, int, timezone]] = {k: int(v) for k, v in kw.items() if v is not None}
|
|
101
|
+
kw_["tzinfo"] = tzinfo
|
|
102
|
+
|
|
103
|
+
return datetime(**kw_) # type: ignore
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def parse_date(value: Union[date, StrBytesIntFloat]) -> date:
|
|
107
|
+
"""
|
|
108
|
+
Parse a date/int/float/string and return a datetime.date.
|
|
109
|
+
|
|
110
|
+
Raise ValueError if the input is well formatted but not a valid date.
|
|
111
|
+
Raise ValueError if the input isn't well formatted.
|
|
112
|
+
"""
|
|
113
|
+
if isinstance(value, date):
|
|
114
|
+
if isinstance(value, datetime):
|
|
115
|
+
return value.date()
|
|
116
|
+
else:
|
|
117
|
+
return value
|
|
118
|
+
|
|
119
|
+
number = _get_numeric(value, "date")
|
|
120
|
+
if number is not None:
|
|
121
|
+
return _from_unix_seconds(number).date()
|
|
122
|
+
|
|
123
|
+
if isinstance(value, bytes):
|
|
124
|
+
value = value.decode()
|
|
125
|
+
|
|
126
|
+
assert not isinstance(value, (float, int))
|
|
127
|
+
match = date_re.match(value)
|
|
128
|
+
if match is None:
|
|
129
|
+
raise ValueError("invalid date format")
|
|
130
|
+
|
|
131
|
+
kw = {k: int(v) for k, v in match.groupdict().items()}
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
return date(**kw)
|
|
135
|
+
except ValueError:
|
|
136
|
+
raise ValueError("invalid date format") from None
|
parallel/_utils/_transform.py
CHANGED
|
@@ -16,18 +16,20 @@ from ._utils import (
|
|
|
16
16
|
lru_cache,
|
|
17
17
|
is_mapping,
|
|
18
18
|
is_iterable,
|
|
19
|
+
is_sequence,
|
|
19
20
|
)
|
|
20
21
|
from .._files import is_base64_file_input
|
|
22
|
+
from ._compat import get_origin, is_typeddict
|
|
21
23
|
from ._typing import (
|
|
22
24
|
is_list_type,
|
|
23
25
|
is_union_type,
|
|
24
26
|
extract_type_arg,
|
|
25
27
|
is_iterable_type,
|
|
26
28
|
is_required_type,
|
|
29
|
+
is_sequence_type,
|
|
27
30
|
is_annotated_type,
|
|
28
31
|
strip_annotated_type,
|
|
29
32
|
)
|
|
30
|
-
from .._compat import get_origin, model_dump, is_typeddict
|
|
31
33
|
|
|
32
34
|
_T = TypeVar("_T")
|
|
33
35
|
|
|
@@ -167,6 +169,8 @@ def _transform_recursive(
|
|
|
167
169
|
|
|
168
170
|
Defaults to the same value as the `annotation` argument.
|
|
169
171
|
"""
|
|
172
|
+
from .._compat import model_dump
|
|
173
|
+
|
|
170
174
|
if inner_type is None:
|
|
171
175
|
inner_type = annotation
|
|
172
176
|
|
|
@@ -184,6 +188,8 @@ def _transform_recursive(
|
|
|
184
188
|
(is_list_type(stripped_type) and is_list(data))
|
|
185
189
|
# Iterable[T]
|
|
186
190
|
or (is_iterable_type(stripped_type) and is_iterable(data) and not isinstance(data, str))
|
|
191
|
+
# Sequence[T]
|
|
192
|
+
or (is_sequence_type(stripped_type) and is_sequence(data) and not isinstance(data, str))
|
|
187
193
|
):
|
|
188
194
|
# dicts are technically iterable, but it is an iterable on the keys of the dict and is not usually
|
|
189
195
|
# intended as an iterable, so we don't transform it.
|
|
@@ -329,6 +335,8 @@ async def _async_transform_recursive(
|
|
|
329
335
|
|
|
330
336
|
Defaults to the same value as the `annotation` argument.
|
|
331
337
|
"""
|
|
338
|
+
from .._compat import model_dump
|
|
339
|
+
|
|
332
340
|
if inner_type is None:
|
|
333
341
|
inner_type = annotation
|
|
334
342
|
|
|
@@ -346,6 +354,8 @@ async def _async_transform_recursive(
|
|
|
346
354
|
(is_list_type(stripped_type) and is_list(data))
|
|
347
355
|
# Iterable[T]
|
|
348
356
|
or (is_iterable_type(stripped_type) and is_iterable(data) and not isinstance(data, str))
|
|
357
|
+
# Sequence[T]
|
|
358
|
+
or (is_sequence_type(stripped_type) and is_sequence(data) and not isinstance(data, str))
|
|
349
359
|
):
|
|
350
360
|
# dicts are technically iterable, but it is an iterable on the keys of the dict and is not usually
|
|
351
361
|
# intended as an iterable, so we don't transform it.
|
parallel/_utils/_typing.py
CHANGED
|
@@ -15,7 +15,7 @@ from typing_extensions import (
|
|
|
15
15
|
|
|
16
16
|
from ._utils import lru_cache
|
|
17
17
|
from .._types import InheritsGeneric
|
|
18
|
-
from
|
|
18
|
+
from ._compat import is_union as _is_union
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def is_annotated_type(typ: type) -> bool:
|
|
@@ -26,6 +26,11 @@ def is_list_type(typ: type) -> bool:
|
|
|
26
26
|
return (get_origin(typ) or typ) == list
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
def is_sequence_type(typ: type) -> bool:
|
|
30
|
+
origin = get_origin(typ) or typ
|
|
31
|
+
return origin == typing_extensions.Sequence or origin == typing.Sequence or origin == _c_abc.Sequence
|
|
32
|
+
|
|
33
|
+
|
|
29
34
|
def is_iterable_type(typ: type) -> bool:
|
|
30
35
|
"""If the given type is `typing.Iterable[T]`"""
|
|
31
36
|
origin = get_origin(typ) or typ
|
parallel/_utils/_utils.py
CHANGED
|
@@ -22,7 +22,6 @@ from typing_extensions import TypeGuard
|
|
|
22
22
|
import sniffio
|
|
23
23
|
|
|
24
24
|
from .._types import NotGiven, FileTypes, NotGivenOr, HeadersLike
|
|
25
|
-
from .._compat import parse_date as parse_date, parse_datetime as parse_datetime
|
|
26
25
|
|
|
27
26
|
_T = TypeVar("_T")
|
|
28
27
|
_TupleT = TypeVar("_TupleT", bound=Tuple[object, ...])
|
parallel/_version.py
CHANGED
parallel/lib/_pydantic.py
CHANGED
|
@@ -6,7 +6,7 @@ from typing_extensions import TypeGuard
|
|
|
6
6
|
|
|
7
7
|
import pydantic
|
|
8
8
|
|
|
9
|
-
from .._compat import
|
|
9
|
+
from .._compat import PYDANTIC_V1, model_json_schema
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def to_json_schema(
|
|
@@ -16,8 +16,8 @@ def to_json_schema(
|
|
|
16
16
|
if is_basemodel_type(model_type):
|
|
17
17
|
schema = model_json_schema(model_type)
|
|
18
18
|
elif isinstance(model_type, pydantic.TypeAdapter):
|
|
19
|
-
if
|
|
20
|
-
raise TypeError(f"TypeAdapters are
|
|
19
|
+
if PYDANTIC_V1:
|
|
20
|
+
raise TypeError(f"TypeAdapters are not supported with Pydantic v1 - {model_type}")
|
|
21
21
|
schema = model_type.json_schema()
|
|
22
22
|
else:
|
|
23
23
|
raise TypeError(f"Unsupported type: {model_type}")
|
|
@@ -26,6 +26,7 @@ def to_json_schema(
|
|
|
26
26
|
schema["additionalProperties"] = False
|
|
27
27
|
return schema
|
|
28
28
|
|
|
29
|
+
|
|
29
30
|
def is_basemodel_type(model_type: object) -> TypeGuard[type[pydantic.BaseModel]]:
|
|
30
31
|
"""Check if a type is a Pydantic BaseModel to avoid using type: ignore."""
|
|
31
32
|
return inspect.isclass(model_type) and issubclass(model_type, pydantic.BaseModel)
|
parallel/resources/__init__.py
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
+
from .beta import (
|
|
4
|
+
BetaResource,
|
|
5
|
+
AsyncBetaResource,
|
|
6
|
+
BetaResourceWithRawResponse,
|
|
7
|
+
AsyncBetaResourceWithRawResponse,
|
|
8
|
+
BetaResourceWithStreamingResponse,
|
|
9
|
+
AsyncBetaResourceWithStreamingResponse,
|
|
10
|
+
)
|
|
3
11
|
from .task_run import (
|
|
4
12
|
TaskRunResource,
|
|
5
13
|
AsyncTaskRunResource,
|
|
@@ -16,4 +24,10 @@ __all__ = [
|
|
|
16
24
|
"AsyncTaskRunResourceWithRawResponse",
|
|
17
25
|
"TaskRunResourceWithStreamingResponse",
|
|
18
26
|
"AsyncTaskRunResourceWithStreamingResponse",
|
|
27
|
+
"BetaResource",
|
|
28
|
+
"AsyncBetaResource",
|
|
29
|
+
"BetaResourceWithRawResponse",
|
|
30
|
+
"AsyncBetaResourceWithRawResponse",
|
|
31
|
+
"BetaResourceWithStreamingResponse",
|
|
32
|
+
"AsyncBetaResourceWithStreamingResponse",
|
|
19
33
|
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
|
+
|
|
3
|
+
from .beta import (
|
|
4
|
+
BetaResource,
|
|
5
|
+
AsyncBetaResource,
|
|
6
|
+
BetaResourceWithRawResponse,
|
|
7
|
+
AsyncBetaResourceWithRawResponse,
|
|
8
|
+
BetaResourceWithStreamingResponse,
|
|
9
|
+
AsyncBetaResourceWithStreamingResponse,
|
|
10
|
+
)
|
|
11
|
+
from .task_run import (
|
|
12
|
+
TaskRunResource,
|
|
13
|
+
AsyncTaskRunResource,
|
|
14
|
+
TaskRunResourceWithRawResponse,
|
|
15
|
+
AsyncTaskRunResourceWithRawResponse,
|
|
16
|
+
TaskRunResourceWithStreamingResponse,
|
|
17
|
+
AsyncTaskRunResourceWithStreamingResponse,
|
|
18
|
+
)
|
|
19
|
+
from .task_group import (
|
|
20
|
+
TaskGroupResource,
|
|
21
|
+
AsyncTaskGroupResource,
|
|
22
|
+
TaskGroupResourceWithRawResponse,
|
|
23
|
+
AsyncTaskGroupResourceWithRawResponse,
|
|
24
|
+
TaskGroupResourceWithStreamingResponse,
|
|
25
|
+
AsyncTaskGroupResourceWithStreamingResponse,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
__all__ = [
|
|
29
|
+
"TaskRunResource",
|
|
30
|
+
"AsyncTaskRunResource",
|
|
31
|
+
"TaskRunResourceWithRawResponse",
|
|
32
|
+
"AsyncTaskRunResourceWithRawResponse",
|
|
33
|
+
"TaskRunResourceWithStreamingResponse",
|
|
34
|
+
"AsyncTaskRunResourceWithStreamingResponse",
|
|
35
|
+
"TaskGroupResource",
|
|
36
|
+
"AsyncTaskGroupResource",
|
|
37
|
+
"TaskGroupResourceWithRawResponse",
|
|
38
|
+
"AsyncTaskGroupResourceWithRawResponse",
|
|
39
|
+
"TaskGroupResourceWithStreamingResponse",
|
|
40
|
+
"AsyncTaskGroupResourceWithStreamingResponse",
|
|
41
|
+
"BetaResource",
|
|
42
|
+
"AsyncBetaResource",
|
|
43
|
+
"BetaResourceWithRawResponse",
|
|
44
|
+
"AsyncBetaResourceWithRawResponse",
|
|
45
|
+
"BetaResourceWithStreamingResponse",
|
|
46
|
+
"AsyncBetaResourceWithStreamingResponse",
|
|
47
|
+
]
|