Skip to content

Commit 09bf61b

Browse files
feat(api): update via SDK Studio
1 parent c202e81 commit 09bf61b

File tree

10 files changed

+637
-22
lines changed

10 files changed

+637
-22
lines changed

.stats.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 174
22
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/digitalocean%2Fgradient-40c154e2fdc4fef9ca1cf8329c29b7102bf324acfc9589571d6f3452d1ca579c.yml
33
openapi_spec_hash: 83a3d092965fde776b29b61f785459f9
4-
config_hash: ddab0a714b26eb4a0ed28df928df0b05
4+
config_hash: 3752c9f438752ab61938a8921bb3befd

api.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ from gradient.types import (
1818
GarbageCollection,
1919
GPUInfo,
2020
Image,
21+
ImageGenCompletedEvent,
22+
ImageGenPartialImageEvent,
23+
ImageGenStreamEvent,
2124
Kernel,
2225
MetaProperties,
2326
NetworkV4,

src/gradient/resources/images/generations.py

Lines changed: 384 additions & 5 deletions
Large diffs are not rendered by default.

src/gradient/types/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,11 @@
4141
GarbageCollection as GarbageCollection,
4242
FirewallRuleTarget as FirewallRuleTarget,
4343
ChatCompletionChunk as ChatCompletionChunk,
44+
ImageGenStreamEvent as ImageGenStreamEvent,
4445
SubscriptionTierBase as SubscriptionTierBase,
46+
ImageGenCompletedEvent as ImageGenCompletedEvent,
4547
DropletNextBackupWindow as DropletNextBackupWindow,
48+
ImageGenPartialImageEvent as ImageGenPartialImageEvent,
4649
ChatCompletionTokenLogprob as ChatCompletionTokenLogprob,
4750
)
4851
from .api_agent import APIAgent as APIAgent

src/gradient/types/images/generation_create_params.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
from __future__ import annotations
44

5-
from typing import Optional
6-
from typing_extensions import Required, TypedDict
5+
from typing import Union, Optional
6+
from typing_extensions import Literal, Required, TypedDict
77

8-
__all__ = ["GenerationCreateParams"]
8+
__all__ = ["GenerationCreateParamsBase", "GenerationCreateParamsNonStreaming", "GenerationCreateParamsStreaming"]
99

1010

11-
class GenerationCreateParams(TypedDict, total=False):
11+
class GenerationCreateParamsBase(TypedDict, total=False):
1212
prompt: Required[str]
1313
"""A text description of the desired image(s).
1414
@@ -70,16 +70,31 @@ class GenerationCreateParams(TypedDict, total=False):
7070
(landscape), 1024x1536 (portrait).
7171
"""
7272

73-
stream: Optional[bool]
73+
user: Optional[str]
74+
"""
75+
A unique identifier representing your end-user, which can help DigitalOcean to
76+
monitor and detect abuse.
77+
"""
78+
79+
80+
class GenerationCreateParamsNonStreaming(GenerationCreateParamsBase, total=False):
81+
stream: Optional[Literal[False]]
7482
"""
7583
If set to true, partial image data will be streamed as the image is being
7684
generated. When streaming, the response will be sent as server-sent events with
7785
partial image chunks. When stream is true, partial_images must be greater
7886
than 0.
7987
"""
8088

81-
user: Optional[str]
89+
90+
class GenerationCreateParamsStreaming(GenerationCreateParamsBase):
91+
stream: Required[Literal[True]]
8292
"""
83-
A unique identifier representing your end-user, which can help DigitalOcean to
84-
monitor and detect abuse.
93+
If set to true, partial image data will be streamed as the image is being
94+
generated. When streaming, the response will be sent as server-sent events with
95+
partial image chunks. When stream is true, partial_images must be greater
96+
than 0.
8597
"""
98+
99+
100+
GenerationCreateParams = Union[GenerationCreateParamsNonStreaming, GenerationCreateParamsStreaming]

src/gradient/types/shared/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
from .garbage_collection import GarbageCollection as GarbageCollection
2525
from .firewall_rule_target import FirewallRuleTarget as FirewallRuleTarget
2626
from .chat_completion_chunk import ChatCompletionChunk as ChatCompletionChunk
27+
from .image_gen_stream_event import ImageGenStreamEvent as ImageGenStreamEvent
2728
from .subscription_tier_base import SubscriptionTierBase as SubscriptionTierBase
29+
from .image_gen_completed_event import ImageGenCompletedEvent as ImageGenCompletedEvent
2830
from .droplet_next_backup_window import DropletNextBackupWindow as DropletNextBackupWindow
2931
from .chat_completion_token_logprob import ChatCompletionTokenLogprob as ChatCompletionTokenLogprob
32+
from .image_gen_partial_image_event import ImageGenPartialImageEvent as ImageGenPartialImageEvent
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing_extensions import Literal
4+
5+
from ..._models import BaseModel
6+
7+
__all__ = ["ImageGenCompletedEvent", "Usage", "UsageInputTokensDetails"]
8+
9+
10+
class UsageInputTokensDetails(BaseModel):
11+
image_tokens: int
12+
"""The number of image tokens in the input prompt."""
13+
14+
text_tokens: int
15+
"""The number of text tokens in the input prompt."""
16+
17+
18+
class Usage(BaseModel):
19+
input_tokens: int
20+
"""The number of tokens (images and text) in the input prompt."""
21+
22+
input_tokens_details: UsageInputTokensDetails
23+
"""The input tokens detailed information for the image generation."""
24+
25+
output_tokens: int
26+
"""The number of image tokens in the output image."""
27+
28+
total_tokens: int
29+
"""The total number of tokens (images and text) used for the image generation."""
30+
31+
32+
class ImageGenCompletedEvent(BaseModel):
33+
b64_json: str
34+
"""Base64-encoded image data, suitable for rendering as an image."""
35+
36+
background: Literal["transparent", "opaque", "auto"]
37+
"""The background setting for the generated image."""
38+
39+
created_at: int
40+
"""The Unix timestamp when the event was created."""
41+
42+
output_format: Literal["png", "webp", "jpeg"]
43+
"""The output format for the generated image."""
44+
45+
quality: Literal["low", "medium", "high", "auto"]
46+
"""The quality setting for the generated image."""
47+
48+
size: Literal["1024x1024", "1024x1536", "1536x1024", "auto"]
49+
"""The size of the generated image."""
50+
51+
type: Literal["image_generation.completed"]
52+
"""The type of the event. Always `image_generation.completed`."""
53+
54+
usage: Usage
55+
"""For `gpt-image-1` only, the token usage information for the image generation."""
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing_extensions import Literal
4+
5+
from ..._models import BaseModel
6+
7+
__all__ = ["ImageGenPartialImageEvent"]
8+
9+
10+
class ImageGenPartialImageEvent(BaseModel):
11+
b64_json: str
12+
"""Base64-encoded partial image data, suitable for rendering as an image."""
13+
14+
background: Literal["transparent", "opaque", "auto"]
15+
"""The background setting for the requested image."""
16+
17+
created_at: int
18+
"""The Unix timestamp when the event was created."""
19+
20+
output_format: Literal["png", "webp", "jpeg"]
21+
"""The output format for the requested image."""
22+
23+
partial_image_index: int
24+
"""0-based index for the partial image (streaming)."""
25+
26+
quality: Literal["low", "medium", "high", "auto"]
27+
"""The quality setting for the requested image."""
28+
29+
size: Literal["1024x1024", "1024x1536", "1536x1024", "auto"]
30+
"""The size of the requested image."""
31+
32+
type: Literal["image_generation.partial_image"]
33+
"""The type of the event. Always `image_generation.partial_image`."""
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Union
4+
from typing_extensions import Annotated, TypeAlias
5+
6+
from ..._utils import PropertyInfo
7+
from .image_gen_completed_event import ImageGenCompletedEvent
8+
from .image_gen_partial_image_event import ImageGenPartialImageEvent
9+
10+
__all__ = ["ImageGenStreamEvent"]
11+
12+
ImageGenStreamEvent: TypeAlias = Annotated[
13+
Union[ImageGenPartialImageEvent, ImageGenCompletedEvent], PropertyInfo(discriminator="type")
14+
]

tests/api_resources/images/test_generations.py

Lines changed: 118 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ class TestGenerations:
1919

2020
@pytest.mark.skip(reason="Prism tests are disabled")
2121
@parametrize
22-
def test_method_create(self, client: Gradient) -> None:
22+
def test_method_create_overload_1(self, client: Gradient) -> None:
2323
generation = client.images.generations.create(
2424
prompt="A cute baby sea otter floating on its back in calm blue water",
2525
)
2626
assert_matches_type(GenerationCreateResponse, generation, path=["response"])
2727

2828
@pytest.mark.skip(reason="Prism tests are disabled")
2929
@parametrize
30-
def test_method_create_with_all_params(self, client: Gradient) -> None:
30+
def test_method_create_with_all_params_overload_1(self, client: Gradient) -> None:
3131
generation = client.images.generations.create(
3232
prompt="A cute baby sea otter floating on its back in calm blue water",
3333
background="auto",
@@ -46,7 +46,7 @@ def test_method_create_with_all_params(self, client: Gradient) -> None:
4646

4747
@pytest.mark.skip(reason="Prism tests are disabled")
4848
@parametrize
49-
def test_raw_response_create(self, client: Gradient) -> None:
49+
def test_raw_response_create_overload_1(self, client: Gradient) -> None:
5050
response = client.images.generations.with_raw_response.create(
5151
prompt="A cute baby sea otter floating on its back in calm blue water",
5252
)
@@ -58,7 +58,7 @@ def test_raw_response_create(self, client: Gradient) -> None:
5858

5959
@pytest.mark.skip(reason="Prism tests are disabled")
6060
@parametrize
61-
def test_streaming_response_create(self, client: Gradient) -> None:
61+
def test_streaming_response_create_overload_1(self, client: Gradient) -> None:
6262
with client.images.generations.with_streaming_response.create(
6363
prompt="A cute baby sea otter floating on its back in calm blue water",
6464
) as response:
@@ -70,6 +70,61 @@ def test_streaming_response_create(self, client: Gradient) -> None:
7070

7171
assert cast(Any, response.is_closed) is True
7272

73+
@pytest.mark.skip(reason="Prism tests are disabled")
74+
@parametrize
75+
def test_method_create_overload_2(self, client: Gradient) -> None:
76+
generation_stream = client.images.generations.create(
77+
prompt="A cute baby sea otter floating on its back in calm blue water",
78+
stream=True,
79+
)
80+
generation_stream.response.close()
81+
82+
@pytest.mark.skip(reason="Prism tests are disabled")
83+
@parametrize
84+
def test_method_create_with_all_params_overload_2(self, client: Gradient) -> None:
85+
generation_stream = client.images.generations.create(
86+
prompt="A cute baby sea otter floating on its back in calm blue water",
87+
stream=True,
88+
background="auto",
89+
model="openai-gpt-image-1",
90+
moderation="auto",
91+
n=1,
92+
output_compression=100,
93+
output_format="png",
94+
partial_images=1,
95+
quality="auto",
96+
size="auto",
97+
user="user-1234",
98+
)
99+
generation_stream.response.close()
100+
101+
@pytest.mark.skip(reason="Prism tests are disabled")
102+
@parametrize
103+
def test_raw_response_create_overload_2(self, client: Gradient) -> None:
104+
response = client.images.generations.with_raw_response.create(
105+
prompt="A cute baby sea otter floating on its back in calm blue water",
106+
stream=True,
107+
)
108+
109+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
110+
stream = response.parse()
111+
stream.close()
112+
113+
@pytest.mark.skip(reason="Prism tests are disabled")
114+
@parametrize
115+
def test_streaming_response_create_overload_2(self, client: Gradient) -> None:
116+
with client.images.generations.with_streaming_response.create(
117+
prompt="A cute baby sea otter floating on its back in calm blue water",
118+
stream=True,
119+
) as response:
120+
assert not response.is_closed
121+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
122+
123+
stream = response.parse()
124+
stream.close()
125+
126+
assert cast(Any, response.is_closed) is True
127+
73128

74129
class TestAsyncGenerations:
75130
parametrize = pytest.mark.parametrize(
@@ -78,15 +133,15 @@ class TestAsyncGenerations:
78133

79134
@pytest.mark.skip(reason="Prism tests are disabled")
80135
@parametrize
81-
async def test_method_create(self, async_client: AsyncGradient) -> None:
136+
async def test_method_create_overload_1(self, async_client: AsyncGradient) -> None:
82137
generation = await async_client.images.generations.create(
83138
prompt="A cute baby sea otter floating on its back in calm blue water",
84139
)
85140
assert_matches_type(GenerationCreateResponse, generation, path=["response"])
86141

87142
@pytest.mark.skip(reason="Prism tests are disabled")
88143
@parametrize
89-
async def test_method_create_with_all_params(self, async_client: AsyncGradient) -> None:
144+
async def test_method_create_with_all_params_overload_1(self, async_client: AsyncGradient) -> None:
90145
generation = await async_client.images.generations.create(
91146
prompt="A cute baby sea otter floating on its back in calm blue water",
92147
background="auto",
@@ -105,7 +160,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncGradient)
105160

106161
@pytest.mark.skip(reason="Prism tests are disabled")
107162
@parametrize
108-
async def test_raw_response_create(self, async_client: AsyncGradient) -> None:
163+
async def test_raw_response_create_overload_1(self, async_client: AsyncGradient) -> None:
109164
response = await async_client.images.generations.with_raw_response.create(
110165
prompt="A cute baby sea otter floating on its back in calm blue water",
111166
)
@@ -117,7 +172,7 @@ async def test_raw_response_create(self, async_client: AsyncGradient) -> None:
117172

118173
@pytest.mark.skip(reason="Prism tests are disabled")
119174
@parametrize
120-
async def test_streaming_response_create(self, async_client: AsyncGradient) -> None:
175+
async def test_streaming_response_create_overload_1(self, async_client: AsyncGradient) -> None:
121176
async with async_client.images.generations.with_streaming_response.create(
122177
prompt="A cute baby sea otter floating on its back in calm blue water",
123178
) as response:
@@ -128,3 +183,58 @@ async def test_streaming_response_create(self, async_client: AsyncGradient) -> N
128183
assert_matches_type(GenerationCreateResponse, generation, path=["response"])
129184

130185
assert cast(Any, response.is_closed) is True
186+
187+
@pytest.mark.skip(reason="Prism tests are disabled")
188+
@parametrize
189+
async def test_method_create_overload_2(self, async_client: AsyncGradient) -> None:
190+
generation_stream = await async_client.images.generations.create(
191+
prompt="A cute baby sea otter floating on its back in calm blue water",
192+
stream=True,
193+
)
194+
await generation_stream.response.aclose()
195+
196+
@pytest.mark.skip(reason="Prism tests are disabled")
197+
@parametrize
198+
async def test_method_create_with_all_params_overload_2(self, async_client: AsyncGradient) -> None:
199+
generation_stream = await async_client.images.generations.create(
200+
prompt="A cute baby sea otter floating on its back in calm blue water",
201+
stream=True,
202+
background="auto",
203+
model="openai-gpt-image-1",
204+
moderation="auto",
205+
n=1,
206+
output_compression=100,
207+
output_format="png",
208+
partial_images=1,
209+
quality="auto",
210+
size="auto",
211+
user="user-1234",
212+
)
213+
await generation_stream.response.aclose()
214+
215+
@pytest.mark.skip(reason="Prism tests are disabled")
216+
@parametrize
217+
async def test_raw_response_create_overload_2(self, async_client: AsyncGradient) -> None:
218+
response = await async_client.images.generations.with_raw_response.create(
219+
prompt="A cute baby sea otter floating on its back in calm blue water",
220+
stream=True,
221+
)
222+
223+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
224+
stream = await response.parse()
225+
await stream.close()
226+
227+
@pytest.mark.skip(reason="Prism tests are disabled")
228+
@parametrize
229+
async def test_streaming_response_create_overload_2(self, async_client: AsyncGradient) -> None:
230+
async with async_client.images.generations.with_streaming_response.create(
231+
prompt="A cute baby sea otter floating on its back in calm blue water",
232+
stream=True,
233+
) as response:
234+
assert not response.is_closed
235+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
236+
237+
stream = await response.parse()
238+
await stream.close()
239+
240+
assert cast(Any, response.is_closed) is True

0 commit comments

Comments
 (0)