Skip to content

Commit e7c5514

Browse files
feat(api): api update
1 parent 0ce3c37 commit e7c5514

File tree

6 files changed

+89
-62
lines changed

6 files changed

+89
-62
lines changed

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 17
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/groqcloud%2Fgroqcloud-780f9b139f5c909c5896f2f12043529ba9eb68c60ccd7c62b717c98694656ec0.yml
3-
openapi_spec_hash: b5e6dad1b275951040d6330e39e13e83
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/groqcloud%2Fgroqcloud-71c67ebb4a7c6e403c7ff4097875bb7d7477f4c11c9ea133302676f25af1af80.yml
3+
openapi_spec_hash: 0bcea04a8f775a28c9081ecddde169ab
44
config_hash: 6b1c374dcc1ffa3165dd22f52a77ff89

api.md

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,19 +129,13 @@ Methods:
129129
Types:
130130

131131
```python
132-
from groq.types import (
133-
FileCreateResponse,
134-
FileListResponse,
135-
FileDeleteResponse,
136-
FileContentResponse,
137-
FileInfoResponse,
138-
)
132+
from groq.types import FileCreateResponse, FileListResponse, FileDeleteResponse, FileInfoResponse
139133
```
140134

141135
Methods:
142136

143137
- <code title="post /openai/v1/files">client.files.<a href="./src/groq/resources/files.py">create</a>(\*\*<a href="src/groq/types/file_create_params.py">params</a>) -> <a href="./src/groq/types/file_create_response.py">FileCreateResponse</a></code>
144138
- <code title="get /openai/v1/files">client.files.<a href="./src/groq/resources/files.py">list</a>() -> <a href="./src/groq/types/file_list_response.py">FileListResponse</a></code>
145139
- <code title="delete /openai/v1/files/{file_id}">client.files.<a href="./src/groq/resources/files.py">delete</a>(file_id) -> <a href="./src/groq/types/file_delete_response.py">FileDeleteResponse</a></code>
146-
- <code title="get /openai/v1/files/{file_id}/content">client.files.<a href="./src/groq/resources/files.py">content</a>(file_id) -> str</code>
140+
- <code title="get /openai/v1/files/{file_id}/content">client.files.<a href="./src/groq/resources/files.py">content</a>(file_id) -> BinaryAPIResponse</code>
147141
- <code title="get /openai/v1/files/{file_id}">client.files.<a href="./src/groq/resources/files.py">info</a>(file_id) -> <a href="./src/groq/types/file_info_response.py">FileInfoResponse</a></code>

src/groq/resources/files.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,18 @@
1818
from .._compat import cached_property
1919
from .._resource import SyncAPIResource, AsyncAPIResource
2020
from .._response import (
21+
BinaryAPIResponse,
22+
AsyncBinaryAPIResponse,
23+
StreamedBinaryAPIResponse,
24+
AsyncStreamedBinaryAPIResponse,
2125
to_raw_response_wrapper,
2226
to_streamed_response_wrapper,
2327
async_to_raw_response_wrapper,
28+
to_custom_raw_response_wrapper,
2429
async_to_streamed_response_wrapper,
30+
to_custom_streamed_response_wrapper,
31+
async_to_custom_raw_response_wrapper,
32+
async_to_custom_streamed_response_wrapper,
2533
)
2634
from .._base_client import make_request_options
2735
from ..types.file_info_response import FileInfoResponse
@@ -169,7 +177,7 @@ def content(
169177
extra_query: Query | None = None,
170178
extra_body: Body | None = None,
171179
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
172-
) -> str:
180+
) -> BinaryAPIResponse:
173181
"""
174182
Returns the contents of the specified file.
175183
@@ -184,12 +192,13 @@ def content(
184192
"""
185193
if not file_id:
186194
raise ValueError(f"Expected a non-empty value for `file_id` but received {file_id!r}")
195+
extra_headers = {"Accept": "application/octet-stream", **(extra_headers or {})}
187196
return self._get(
188197
f"/openai/v1/files/{file_id}/content",
189198
options=make_request_options(
190199
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
191200
),
192-
cast_to=str,
201+
cast_to=BinaryAPIResponse,
193202
)
194203

195204
def info(
@@ -363,7 +372,7 @@ async def content(
363372
extra_query: Query | None = None,
364373
extra_body: Body | None = None,
365374
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
366-
) -> str:
375+
) -> AsyncBinaryAPIResponse:
367376
"""
368377
Returns the contents of the specified file.
369378
@@ -378,12 +387,13 @@ async def content(
378387
"""
379388
if not file_id:
380389
raise ValueError(f"Expected a non-empty value for `file_id` but received {file_id!r}")
390+
extra_headers = {"Accept": "application/octet-stream", **(extra_headers or {})}
381391
return await self._get(
382392
f"/openai/v1/files/{file_id}/content",
383393
options=make_request_options(
384394
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
385395
),
386-
cast_to=str,
396+
cast_to=AsyncBinaryAPIResponse,
387397
)
388398

389399
async def info(
@@ -433,8 +443,9 @@ def __init__(self, files: Files) -> None:
433443
self.delete = to_raw_response_wrapper(
434444
files.delete,
435445
)
436-
self.content = to_raw_response_wrapper(
446+
self.content = to_custom_raw_response_wrapper(
437447
files.content,
448+
BinaryAPIResponse,
438449
)
439450
self.info = to_raw_response_wrapper(
440451
files.info,
@@ -454,8 +465,9 @@ def __init__(self, files: AsyncFiles) -> None:
454465
self.delete = async_to_raw_response_wrapper(
455466
files.delete,
456467
)
457-
self.content = async_to_raw_response_wrapper(
468+
self.content = async_to_custom_raw_response_wrapper(
458469
files.content,
470+
AsyncBinaryAPIResponse,
459471
)
460472
self.info = async_to_raw_response_wrapper(
461473
files.info,
@@ -475,8 +487,9 @@ def __init__(self, files: Files) -> None:
475487
self.delete = to_streamed_response_wrapper(
476488
files.delete,
477489
)
478-
self.content = to_streamed_response_wrapper(
490+
self.content = to_custom_streamed_response_wrapper(
479491
files.content,
492+
StreamedBinaryAPIResponse,
480493
)
481494
self.info = to_streamed_response_wrapper(
482495
files.info,
@@ -496,8 +509,9 @@ def __init__(self, files: AsyncFiles) -> None:
496509
self.delete = async_to_streamed_response_wrapper(
497510
files.delete,
498511
)
499-
self.content = async_to_streamed_response_wrapper(
512+
self.content = async_to_custom_streamed_response_wrapper(
500513
files.content,
514+
AsyncStreamedBinaryAPIResponse,
501515
)
502516
self.info = async_to_streamed_response_wrapper(
503517
files.info,

src/groq/types/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from .file_delete_response import FileDeleteResponse as FileDeleteResponse
2222
from .batch_cancel_response import BatchCancelResponse as BatchCancelResponse
2323
from .batch_create_response import BatchCreateResponse as BatchCreateResponse
24-
from .file_content_response import FileContentResponse as FileContentResponse
2524
from .batch_retrieve_response import BatchRetrieveResponse as BatchRetrieveResponse
2625
from .embedding_create_params import EmbeddingCreateParams as EmbeddingCreateParams
2726
from .create_embedding_response import CreateEmbeddingResponse as CreateEmbeddingResponse

src/groq/types/file_content_response.py

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/api_resources/test_files.py

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,19 @@
55
import os
66
from typing import Any, cast
77

8+
import httpx
89
import pytest
10+
from respx import MockRouter
911

1012
from groq import Groq, AsyncGroq
11-
from groq.types import (
12-
FileInfoResponse,
13-
FileListResponse,
14-
FileCreateResponse,
15-
FileDeleteResponse,
16-
)
13+
from groq.types import FileInfoResponse, FileListResponse, FileCreateResponse, FileDeleteResponse
1714
from tests.utils import assert_matches_type
15+
from groq._response import (
16+
BinaryAPIResponse,
17+
AsyncBinaryAPIResponse,
18+
StreamedBinaryAPIResponse,
19+
AsyncStreamedBinaryAPIResponse,
20+
)
1821

1922
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
2023

@@ -120,37 +123,49 @@ def test_path_params_delete(self, client: Groq) -> None:
120123
)
121124

122125
@parametrize
123-
def test_method_content(self, client: Groq) -> None:
126+
@pytest.mark.respx(base_url=base_url)
127+
def test_method_content(self, client: Groq, respx_mock: MockRouter) -> None:
128+
respx_mock.get("/openai/v1/files/file_id/content").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
124129
file = client.files.content(
125130
"file_id",
126131
)
127-
assert_matches_type(str, file, path=["response"])
132+
assert file.is_closed
133+
assert file.json() == {"foo": "bar"}
134+
assert cast(Any, file.is_closed) is True
135+
assert isinstance(file, BinaryAPIResponse)
128136

129137
@parametrize
130-
def test_raw_response_content(self, client: Groq) -> None:
131-
response = client.files.with_raw_response.content(
138+
@pytest.mark.respx(base_url=base_url)
139+
def test_raw_response_content(self, client: Groq, respx_mock: MockRouter) -> None:
140+
respx_mock.get("/openai/v1/files/file_id/content").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
141+
142+
file = client.files.with_raw_response.content(
132143
"file_id",
133144
)
134145

135-
assert response.is_closed is True
136-
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
137-
file = response.parse()
138-
assert_matches_type(str, file, path=["response"])
146+
assert file.is_closed is True
147+
assert file.http_request.headers.get("X-Stainless-Lang") == "python"
148+
assert file.json() == {"foo": "bar"}
149+
assert isinstance(file, BinaryAPIResponse)
139150

140151
@parametrize
141-
def test_streaming_response_content(self, client: Groq) -> None:
152+
@pytest.mark.respx(base_url=base_url)
153+
def test_streaming_response_content(self, client: Groq, respx_mock: MockRouter) -> None:
154+
respx_mock.get("/openai/v1/files/file_id/content").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
142155
with client.files.with_streaming_response.content(
143156
"file_id",
144-
) as response:
145-
assert not response.is_closed
146-
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
157+
) as file:
158+
assert not file.is_closed
159+
assert file.http_request.headers.get("X-Stainless-Lang") == "python"
147160

148-
file = response.parse()
149-
assert_matches_type(str, file, path=["response"])
161+
assert file.json() == {"foo": "bar"}
162+
assert cast(Any, file.is_closed) is True
163+
assert isinstance(file, StreamedBinaryAPIResponse)
150164

151-
assert cast(Any, response.is_closed) is True
165+
assert cast(Any, file.is_closed) is True
152166

153167
@parametrize
168+
@pytest.mark.respx(base_url=base_url)
154169
def test_path_params_content(self, client: Groq) -> None:
155170
with pytest.raises(ValueError, match=r"Expected a non-empty value for `file_id` but received ''"):
156171
client.files.with_raw_response.content(
@@ -297,37 +312,49 @@ async def test_path_params_delete(self, async_client: AsyncGroq) -> None:
297312
)
298313

299314
@parametrize
300-
async def test_method_content(self, async_client: AsyncGroq) -> None:
315+
@pytest.mark.respx(base_url=base_url)
316+
async def test_method_content(self, async_client: AsyncGroq, respx_mock: MockRouter) -> None:
317+
respx_mock.get("/openai/v1/files/file_id/content").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
301318
file = await async_client.files.content(
302319
"file_id",
303320
)
304-
assert_matches_type(str, file, path=["response"])
321+
assert file.is_closed
322+
assert await file.json() == {"foo": "bar"}
323+
assert cast(Any, file.is_closed) is True
324+
assert isinstance(file, AsyncBinaryAPIResponse)
305325

306326
@parametrize
307-
async def test_raw_response_content(self, async_client: AsyncGroq) -> None:
308-
response = await async_client.files.with_raw_response.content(
327+
@pytest.mark.respx(base_url=base_url)
328+
async def test_raw_response_content(self, async_client: AsyncGroq, respx_mock: MockRouter) -> None:
329+
respx_mock.get("/openai/v1/files/file_id/content").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
330+
331+
file = await async_client.files.with_raw_response.content(
309332
"file_id",
310333
)
311334

312-
assert response.is_closed is True
313-
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
314-
file = await response.parse()
315-
assert_matches_type(str, file, path=["response"])
335+
assert file.is_closed is True
336+
assert file.http_request.headers.get("X-Stainless-Lang") == "python"
337+
assert await file.json() == {"foo": "bar"}
338+
assert isinstance(file, AsyncBinaryAPIResponse)
316339

317340
@parametrize
318-
async def test_streaming_response_content(self, async_client: AsyncGroq) -> None:
341+
@pytest.mark.respx(base_url=base_url)
342+
async def test_streaming_response_content(self, async_client: AsyncGroq, respx_mock: MockRouter) -> None:
343+
respx_mock.get("/openai/v1/files/file_id/content").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
319344
async with async_client.files.with_streaming_response.content(
320345
"file_id",
321-
) as response:
322-
assert not response.is_closed
323-
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
346+
) as file:
347+
assert not file.is_closed
348+
assert file.http_request.headers.get("X-Stainless-Lang") == "python"
324349

325-
file = await response.parse()
326-
assert_matches_type(str, file, path=["response"])
350+
assert await file.json() == {"foo": "bar"}
351+
assert cast(Any, file.is_closed) is True
352+
assert isinstance(file, AsyncStreamedBinaryAPIResponse)
327353

328-
assert cast(Any, response.is_closed) is True
354+
assert cast(Any, file.is_closed) is True
329355

330356
@parametrize
357+
@pytest.mark.respx(base_url=base_url)
331358
async def test_path_params_content(self, async_client: AsyncGroq) -> None:
332359
with pytest.raises(ValueError, match=r"Expected a non-empty value for `file_id` but received ''"):
333360
await async_client.files.with_raw_response.content(

0 commit comments

Comments
 (0)