Skip to content

Commit 7da8844

Browse files
feat(api): api update (#140)
1 parent 5482059 commit 7da8844

File tree

7 files changed

+262
-4
lines changed

7 files changed

+262
-4
lines changed

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
configured_endpoints: 9
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/luma-ai-karanganesan%2Fluma_ai-5acd7a1b7a6bd23759fc755404fa2bc8c214c3239058ffe2808b3f1c4a3c521d.yml
1+
configured_endpoints: 10
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/luma-ai-karanganesan%2Fluma_ai-40360b5fde0fe57b8078d35565a402c5dc9af5cafa897fba042fdceff9d32617.yml

api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Methods:
1111
- <code title="post /generations">client.generations.<a href="./src/lumaai/resources/generations/generations.py">create</a>(\*\*<a href="src/lumaai/types/generation_create_params.py">params</a>) -> <a href="./src/lumaai/types/generation.py">Generation</a></code>
1212
- <code title="get /generations">client.generations.<a href="./src/lumaai/resources/generations/generations.py">list</a>(\*\*<a href="src/lumaai/types/generation_list_params.py">params</a>) -> <a href="./src/lumaai/types/generation_list_response.py">GenerationListResponse</a></code>
1313
- <code title="delete /generations/{id}">client.generations.<a href="./src/lumaai/resources/generations/generations.py">delete</a>(id) -> None</code>
14+
- <code title="post /generations/{id}/audio">client.generations.<a href="./src/lumaai/resources/generations/generations.py">audio</a>(id, \*\*<a href="src/lumaai/types/generation_audio_params.py">params</a>) -> <a href="./src/lumaai/types/generation.py">Generation</a></code>
1415
- <code title="get /generations/{id}">client.generations.<a href="./src/lumaai/resources/generations/generations.py">get</a>(id) -> <a href="./src/lumaai/types/generation.py">Generation</a></code>
1516
- <code title="post /generations/{id}/upscale">client.generations.<a href="./src/lumaai/resources/generations/generations.py">upscale</a>(id, \*\*<a href="src/lumaai/types/generation_upscale_params.py">params</a>) -> <a href="./src/lumaai/types/generation.py">Generation</a></code>
1617

src/lumaai/resources/generations/generations.py

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@
2323
VideoResourceWithStreamingResponse,
2424
AsyncVideoResourceWithStreamingResponse,
2525
)
26-
from ...types import generation_list_params, generation_create_params, generation_upscale_params
26+
from ...types import (
27+
generation_list_params,
28+
generation_audio_params,
29+
generation_create_params,
30+
generation_upscale_params,
31+
)
2732
from ..._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven
2833
from ..._utils import (
2934
maybe_transform,
@@ -231,6 +236,58 @@ def delete(
231236
cast_to=NoneType,
232237
)
233238

239+
def audio(
240+
self,
241+
id: str,
242+
*,
243+
callback_url: str | NotGiven = NOT_GIVEN,
244+
generation_type: Literal["add_audio"] | NotGiven = NOT_GIVEN,
245+
negative_prompt: str | NotGiven = NOT_GIVEN,
246+
prompt: str | NotGiven = NOT_GIVEN,
247+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
248+
# The extra values given here take precedence over values defined on the client or passed to this method.
249+
extra_headers: Headers | None = None,
250+
extra_query: Query | None = None,
251+
extra_body: Body | None = None,
252+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
253+
) -> Generation:
254+
"""
255+
Add audio to a generation by its ID
256+
257+
Args:
258+
callback_url: The callback URL for the audio
259+
260+
negative_prompt: The negative prompt of the audio
261+
262+
prompt: The prompt of the audio
263+
264+
extra_headers: Send extra headers
265+
266+
extra_query: Add additional query parameters to the request
267+
268+
extra_body: Add additional JSON properties to the request
269+
270+
timeout: Override the client-level default timeout for this request, in seconds
271+
"""
272+
if not id:
273+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
274+
return self._post(
275+
f"/generations/{id}/audio",
276+
body=maybe_transform(
277+
{
278+
"callback_url": callback_url,
279+
"generation_type": generation_type,
280+
"negative_prompt": negative_prompt,
281+
"prompt": prompt,
282+
},
283+
generation_audio_params.GenerationAudioParams,
284+
),
285+
options=make_request_options(
286+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
287+
),
288+
cast_to=Generation,
289+
)
290+
234291
def get(
235292
self,
236293
id: str,
@@ -492,6 +549,58 @@ async def delete(
492549
cast_to=NoneType,
493550
)
494551

552+
async def audio(
553+
self,
554+
id: str,
555+
*,
556+
callback_url: str | NotGiven = NOT_GIVEN,
557+
generation_type: Literal["add_audio"] | NotGiven = NOT_GIVEN,
558+
negative_prompt: str | NotGiven = NOT_GIVEN,
559+
prompt: str | NotGiven = NOT_GIVEN,
560+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
561+
# The extra values given here take precedence over values defined on the client or passed to this method.
562+
extra_headers: Headers | None = None,
563+
extra_query: Query | None = None,
564+
extra_body: Body | None = None,
565+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
566+
) -> Generation:
567+
"""
568+
Add audio to a generation by its ID
569+
570+
Args:
571+
callback_url: The callback URL for the audio
572+
573+
negative_prompt: The negative prompt of the audio
574+
575+
prompt: The prompt of the audio
576+
577+
extra_headers: Send extra headers
578+
579+
extra_query: Add additional query parameters to the request
580+
581+
extra_body: Add additional JSON properties to the request
582+
583+
timeout: Override the client-level default timeout for this request, in seconds
584+
"""
585+
if not id:
586+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
587+
return await self._post(
588+
f"/generations/{id}/audio",
589+
body=await async_maybe_transform(
590+
{
591+
"callback_url": callback_url,
592+
"generation_type": generation_type,
593+
"negative_prompt": negative_prompt,
594+
"prompt": prompt,
595+
},
596+
generation_audio_params.GenerationAudioParams,
597+
),
598+
options=make_request_options(
599+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
600+
),
601+
cast_to=Generation,
602+
)
603+
495604
async def get(
496605
self,
497606
id: str,
@@ -587,6 +696,9 @@ def __init__(self, generations: GenerationsResource) -> None:
587696
self.delete = to_raw_response_wrapper(
588697
generations.delete,
589698
)
699+
self.audio = to_raw_response_wrapper(
700+
generations.audio,
701+
)
590702
self.get = to_raw_response_wrapper(
591703
generations.get,
592704
)
@@ -620,6 +732,9 @@ def __init__(self, generations: AsyncGenerationsResource) -> None:
620732
self.delete = async_to_raw_response_wrapper(
621733
generations.delete,
622734
)
735+
self.audio = async_to_raw_response_wrapper(
736+
generations.audio,
737+
)
623738
self.get = async_to_raw_response_wrapper(
624739
generations.get,
625740
)
@@ -653,6 +768,9 @@ def __init__(self, generations: GenerationsResource) -> None:
653768
self.delete = to_streamed_response_wrapper(
654769
generations.delete,
655770
)
771+
self.audio = to_streamed_response_wrapper(
772+
generations.audio,
773+
)
656774
self.get = to_streamed_response_wrapper(
657775
generations.get,
658776
)
@@ -686,6 +804,9 @@ def __init__(self, generations: AsyncGenerationsResource) -> None:
686804
self.delete = async_to_streamed_response_wrapper(
687805
generations.delete,
688806
)
807+
self.audio = async_to_streamed_response_wrapper(
808+
generations.audio,
809+
)
689810
self.get = async_to_streamed_response_wrapper(
690811
generations.get,
691812
)

src/lumaai/types/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from .credit_get_response import CreditGetResponse as CreditGetResponse
77
from .ping_check_response import PingCheckResponse as PingCheckResponse
88
from .generation_list_params import GenerationListParams as GenerationListParams
9+
from .generation_audio_params import GenerationAudioParams as GenerationAudioParams
910
from .generation_create_params import GenerationCreateParams as GenerationCreateParams
1011
from .generation_list_response import GenerationListResponse as GenerationListResponse
1112
from .generation_upscale_params import GenerationUpscaleParams as GenerationUpscaleParams

src/lumaai/types/generation.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"RequestImageGenerationRequestModifyImageRef",
2727
"RequestImageGenerationRequestStyleRef",
2828
"RequestUpscaleVideoGenerationRequest",
29+
"RequestAudioGenerationRequest",
2930
]
3031

3132

@@ -195,8 +196,24 @@ class RequestUpscaleVideoGenerationRequest(BaseModel):
195196
"""The resolution of the upscale"""
196197

197198

199+
class RequestAudioGenerationRequest(BaseModel):
200+
callback_url: Optional[str] = None
201+
"""The callback URL for the audio"""
202+
203+
generation_type: Optional[Literal["add_audio"]] = None
204+
205+
negative_prompt: Optional[str] = None
206+
"""The negative prompt of the audio"""
207+
208+
prompt: Optional[str] = None
209+
"""The prompt of the audio"""
210+
211+
198212
Request: TypeAlias = Union[
199-
RequestGenerationRequest, RequestImageGenerationRequest, RequestUpscaleVideoGenerationRequest
213+
RequestGenerationRequest,
214+
RequestImageGenerationRequest,
215+
RequestUpscaleVideoGenerationRequest,
216+
RequestAudioGenerationRequest,
200217
]
201218

202219

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
from typing_extensions import Literal, TypedDict
6+
7+
__all__ = ["GenerationAudioParams"]
8+
9+
10+
class GenerationAudioParams(TypedDict, total=False):
11+
callback_url: str
12+
"""The callback URL for the audio"""
13+
14+
generation_type: Literal["add_audio"]
15+
16+
negative_prompt: str
17+
"""The negative prompt of the audio"""
18+
19+
prompt: str
20+
"""The prompt of the audio"""

tests/api_resources/test_generations.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,55 @@ def test_path_params_delete(self, client: LumaAI) -> None:
140140
"",
141141
)
142142

143+
@parametrize
144+
def test_method_audio(self, client: LumaAI) -> None:
145+
generation = client.generations.audio(
146+
id="id",
147+
)
148+
assert_matches_type(Generation, generation, path=["response"])
149+
150+
@parametrize
151+
def test_method_audio_with_all_params(self, client: LumaAI) -> None:
152+
generation = client.generations.audio(
153+
id="id",
154+
callback_url="https://example.com",
155+
generation_type="add_audio",
156+
negative_prompt="negative_prompt",
157+
prompt="prompt",
158+
)
159+
assert_matches_type(Generation, generation, path=["response"])
160+
161+
@parametrize
162+
def test_raw_response_audio(self, client: LumaAI) -> None:
163+
response = client.generations.with_raw_response.audio(
164+
id="id",
165+
)
166+
167+
assert response.is_closed is True
168+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
169+
generation = response.parse()
170+
assert_matches_type(Generation, generation, path=["response"])
171+
172+
@parametrize
173+
def test_streaming_response_audio(self, client: LumaAI) -> None:
174+
with client.generations.with_streaming_response.audio(
175+
id="id",
176+
) as response:
177+
assert not response.is_closed
178+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
179+
180+
generation = response.parse()
181+
assert_matches_type(Generation, generation, path=["response"])
182+
183+
assert cast(Any, response.is_closed) is True
184+
185+
@parametrize
186+
def test_path_params_audio(self, client: LumaAI) -> None:
187+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
188+
client.generations.with_raw_response.audio(
189+
id="",
190+
)
191+
143192
@parametrize
144193
def test_method_get(self, client: LumaAI) -> None:
145194
generation = client.generations.get(
@@ -350,6 +399,55 @@ async def test_path_params_delete(self, async_client: AsyncLumaAI) -> None:
350399
"",
351400
)
352401

402+
@parametrize
403+
async def test_method_audio(self, async_client: AsyncLumaAI) -> None:
404+
generation = await async_client.generations.audio(
405+
id="id",
406+
)
407+
assert_matches_type(Generation, generation, path=["response"])
408+
409+
@parametrize
410+
async def test_method_audio_with_all_params(self, async_client: AsyncLumaAI) -> None:
411+
generation = await async_client.generations.audio(
412+
id="id",
413+
callback_url="https://example.com",
414+
generation_type="add_audio",
415+
negative_prompt="negative_prompt",
416+
prompt="prompt",
417+
)
418+
assert_matches_type(Generation, generation, path=["response"])
419+
420+
@parametrize
421+
async def test_raw_response_audio(self, async_client: AsyncLumaAI) -> None:
422+
response = await async_client.generations.with_raw_response.audio(
423+
id="id",
424+
)
425+
426+
assert response.is_closed is True
427+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
428+
generation = await response.parse()
429+
assert_matches_type(Generation, generation, path=["response"])
430+
431+
@parametrize
432+
async def test_streaming_response_audio(self, async_client: AsyncLumaAI) -> None:
433+
async with async_client.generations.with_streaming_response.audio(
434+
id="id",
435+
) as response:
436+
assert not response.is_closed
437+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
438+
439+
generation = await response.parse()
440+
assert_matches_type(Generation, generation, path=["response"])
441+
442+
assert cast(Any, response.is_closed) is True
443+
444+
@parametrize
445+
async def test_path_params_audio(self, async_client: AsyncLumaAI) -> None:
446+
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
447+
await async_client.generations.with_raw_response.audio(
448+
id="",
449+
)
450+
353451
@parametrize
354452
async def test_method_get(self, async_client: AsyncLumaAI) -> None:
355453
generation = await async_client.generations.get(

0 commit comments

Comments
 (0)