perplexityai 0.4.0__tar.gz → 0.5.0__tar.gz
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 perplexityai might be problematic. Click here for more details.
- perplexityai-0.5.0/.release-please-manifest.json +3 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/CHANGELOG.md +8 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/PKG-INFO +7 -7
- {perplexityai-0.4.0 → perplexityai-0.5.0}/README.md +6 -6
- {perplexityai-0.4.0 → perplexityai-0.5.0}/pyproject.toml +1 -1
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_client.py +24 -24
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_version.py +1 -1
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/conftest.py +3 -3
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_client.py +63 -101
- perplexityai-0.4.0/.release-please-manifest.json +0 -3
- {perplexityai-0.4.0 → perplexityai-0.5.0}/.gitignore +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/CONTRIBUTING.md +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/LICENSE +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/SECURITY.md +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/api.md +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/bin/check-release-environment +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/bin/publish-pypi +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/examples/.keep +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/noxfile.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/release-please-config.json +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/requirements-dev.lock +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/requirements.lock +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/__init__.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_base_client.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_compat.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_constants.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_exceptions.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_files.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_models.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_qs.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_resource.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_response.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_streaming.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_types.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/__init__.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_compat.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_datetime_parse.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_logs.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_proxy.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_reflection.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_resources_proxy.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_streams.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_sync.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_transform.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_typing.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/_utils/_utils.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/lib/.keep +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/py.typed +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/resources/__init__.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/resources/search.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/types/__init__.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/types/search_create_params.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/src/perplexity/types/search_create_response.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/__init__.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/api_resources/__init__.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/api_resources/test_search.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/sample_file.txt +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_deepcopy.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_extract_files.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_files.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_models.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_qs.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_required_args.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_response.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_streaming.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_transform.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_utils/test_proxy.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/test_utils/test_typing.py +0 -0
- {perplexityai-0.4.0 → perplexityai-0.5.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.0 (2025-09-08)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v0.4.0...v0.5.0](https://github.com/ppl-ai/perplexity-py/compare/v0.4.0...v0.5.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **api:** change bearer_token to api_key ([875bba1](https://github.com/ppl-ai/perplexity-py/commit/875bba126072093d572f00818746b0637a1a56a6))
|
|
10
|
+
|
|
3
11
|
## 0.4.0 (2025-09-07)
|
|
4
12
|
|
|
5
13
|
Full Changelog: [v0.3.0...v0.4.0](https://github.com/ppl-ai/perplexity-py/compare/v0.3.0...v0.4.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: perplexityai
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: The official Python library for the perplexity API
|
|
5
5
|
Project-URL: Homepage, https://github.com/ppl-ai/perplexity-py
|
|
6
6
|
Project-URL: Repository, https://github.com/ppl-ai/perplexity-py
|
|
@@ -64,7 +64,7 @@ import os
|
|
|
64
64
|
from perplexity import Perplexity
|
|
65
65
|
|
|
66
66
|
client = Perplexity(
|
|
67
|
-
|
|
67
|
+
api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
|
|
68
68
|
)
|
|
69
69
|
|
|
70
70
|
search = client.search.create(
|
|
@@ -73,10 +73,10 @@ search = client.search.create(
|
|
|
73
73
|
print(search.id)
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
While you can provide
|
|
76
|
+
While you can provide an `api_key` keyword argument,
|
|
77
77
|
we recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)
|
|
78
|
-
to add `PERPLEXITY_API_KEY="My
|
|
79
|
-
so that your
|
|
78
|
+
to add `PERPLEXITY_API_KEY="My API Key"` to your `.env` file
|
|
79
|
+
so that your API Key is not stored in source control.
|
|
80
80
|
|
|
81
81
|
## Async usage
|
|
82
82
|
|
|
@@ -88,7 +88,7 @@ import asyncio
|
|
|
88
88
|
from perplexity import AsyncPerplexity
|
|
89
89
|
|
|
90
90
|
client = AsyncPerplexity(
|
|
91
|
-
|
|
91
|
+
api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
|
|
92
92
|
)
|
|
93
93
|
|
|
94
94
|
|
|
@@ -125,7 +125,7 @@ from perplexity import AsyncPerplexity
|
|
|
125
125
|
|
|
126
126
|
async def main() -> None:
|
|
127
127
|
async with AsyncPerplexity(
|
|
128
|
-
|
|
128
|
+
api_key="My API Key",
|
|
129
129
|
http_client=DefaultAioHttpClient(),
|
|
130
130
|
) as client:
|
|
131
131
|
search = await client.search.create(
|
|
@@ -29,7 +29,7 @@ import os
|
|
|
29
29
|
from perplexity import Perplexity
|
|
30
30
|
|
|
31
31
|
client = Perplexity(
|
|
32
|
-
|
|
32
|
+
api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
|
|
33
33
|
)
|
|
34
34
|
|
|
35
35
|
search = client.search.create(
|
|
@@ -38,10 +38,10 @@ search = client.search.create(
|
|
|
38
38
|
print(search.id)
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
While you can provide
|
|
41
|
+
While you can provide an `api_key` keyword argument,
|
|
42
42
|
we recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)
|
|
43
|
-
to add `PERPLEXITY_API_KEY="My
|
|
44
|
-
so that your
|
|
43
|
+
to add `PERPLEXITY_API_KEY="My API Key"` to your `.env` file
|
|
44
|
+
so that your API Key is not stored in source control.
|
|
45
45
|
|
|
46
46
|
## Async usage
|
|
47
47
|
|
|
@@ -53,7 +53,7 @@ import asyncio
|
|
|
53
53
|
from perplexity import AsyncPerplexity
|
|
54
54
|
|
|
55
55
|
client = AsyncPerplexity(
|
|
56
|
-
|
|
56
|
+
api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
|
|
57
57
|
)
|
|
58
58
|
|
|
59
59
|
|
|
@@ -90,7 +90,7 @@ from perplexity import AsyncPerplexity
|
|
|
90
90
|
|
|
91
91
|
async def main() -> None:
|
|
92
92
|
async with AsyncPerplexity(
|
|
93
|
-
|
|
93
|
+
api_key="My API Key",
|
|
94
94
|
http_client=DefaultAioHttpClient(),
|
|
95
95
|
) as client:
|
|
96
96
|
search = await client.search.create(
|
|
@@ -48,12 +48,12 @@ class Perplexity(SyncAPIClient):
|
|
|
48
48
|
with_streaming_response: PerplexityWithStreamedResponse
|
|
49
49
|
|
|
50
50
|
# client options
|
|
51
|
-
|
|
51
|
+
api_key: str
|
|
52
52
|
|
|
53
53
|
def __init__(
|
|
54
54
|
self,
|
|
55
55
|
*,
|
|
56
|
-
|
|
56
|
+
api_key: str | None = None,
|
|
57
57
|
base_url: str | httpx.URL | None = None,
|
|
58
58
|
timeout: Union[float, Timeout, None, NotGiven] = NOT_GIVEN,
|
|
59
59
|
max_retries: int = DEFAULT_MAX_RETRIES,
|
|
@@ -75,15 +75,15 @@ class Perplexity(SyncAPIClient):
|
|
|
75
75
|
) -> None:
|
|
76
76
|
"""Construct a new synchronous Perplexity client instance.
|
|
77
77
|
|
|
78
|
-
This automatically infers the `
|
|
78
|
+
This automatically infers the `api_key` argument from the `PERPLEXITY_API_KEY` environment variable if it is not provided.
|
|
79
79
|
"""
|
|
80
|
-
if
|
|
81
|
-
|
|
82
|
-
if
|
|
80
|
+
if api_key is None:
|
|
81
|
+
api_key = os.environ.get("PERPLEXITY_API_KEY")
|
|
82
|
+
if api_key is None:
|
|
83
83
|
raise PerplexityError(
|
|
84
|
-
"The
|
|
84
|
+
"The api_key client option must be set either by passing api_key to the client or by setting the PERPLEXITY_API_KEY environment variable"
|
|
85
85
|
)
|
|
86
|
-
self.
|
|
86
|
+
self.api_key = api_key
|
|
87
87
|
|
|
88
88
|
if base_url is None:
|
|
89
89
|
base_url = os.environ.get("PERPLEXITY_BASE_URL")
|
|
@@ -113,8 +113,8 @@ class Perplexity(SyncAPIClient):
|
|
|
113
113
|
@property
|
|
114
114
|
@override
|
|
115
115
|
def auth_headers(self) -> dict[str, str]:
|
|
116
|
-
|
|
117
|
-
return {"Authorization": f"Bearer {
|
|
116
|
+
api_key = self.api_key
|
|
117
|
+
return {"Authorization": f"Bearer {api_key}"}
|
|
118
118
|
|
|
119
119
|
@property
|
|
120
120
|
@override
|
|
@@ -128,7 +128,7 @@ class Perplexity(SyncAPIClient):
|
|
|
128
128
|
def copy(
|
|
129
129
|
self,
|
|
130
130
|
*,
|
|
131
|
-
|
|
131
|
+
api_key: str | None = None,
|
|
132
132
|
base_url: str | httpx.URL | None = None,
|
|
133
133
|
timeout: float | Timeout | None | NotGiven = NOT_GIVEN,
|
|
134
134
|
http_client: httpx.Client | None = None,
|
|
@@ -162,7 +162,7 @@ class Perplexity(SyncAPIClient):
|
|
|
162
162
|
|
|
163
163
|
http_client = http_client or self._client
|
|
164
164
|
return self.__class__(
|
|
165
|
-
|
|
165
|
+
api_key=api_key or self.api_key,
|
|
166
166
|
base_url=base_url or self.base_url,
|
|
167
167
|
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
|
|
168
168
|
http_client=http_client,
|
|
@@ -216,12 +216,12 @@ class AsyncPerplexity(AsyncAPIClient):
|
|
|
216
216
|
with_streaming_response: AsyncPerplexityWithStreamedResponse
|
|
217
217
|
|
|
218
218
|
# client options
|
|
219
|
-
|
|
219
|
+
api_key: str
|
|
220
220
|
|
|
221
221
|
def __init__(
|
|
222
222
|
self,
|
|
223
223
|
*,
|
|
224
|
-
|
|
224
|
+
api_key: str | None = None,
|
|
225
225
|
base_url: str | httpx.URL | None = None,
|
|
226
226
|
timeout: Union[float, Timeout, None, NotGiven] = NOT_GIVEN,
|
|
227
227
|
max_retries: int = DEFAULT_MAX_RETRIES,
|
|
@@ -243,15 +243,15 @@ class AsyncPerplexity(AsyncAPIClient):
|
|
|
243
243
|
) -> None:
|
|
244
244
|
"""Construct a new async AsyncPerplexity client instance.
|
|
245
245
|
|
|
246
|
-
This automatically infers the `
|
|
246
|
+
This automatically infers the `api_key` argument from the `PERPLEXITY_API_KEY` environment variable if it is not provided.
|
|
247
247
|
"""
|
|
248
|
-
if
|
|
249
|
-
|
|
250
|
-
if
|
|
248
|
+
if api_key is None:
|
|
249
|
+
api_key = os.environ.get("PERPLEXITY_API_KEY")
|
|
250
|
+
if api_key is None:
|
|
251
251
|
raise PerplexityError(
|
|
252
|
-
"The
|
|
252
|
+
"The api_key client option must be set either by passing api_key to the client or by setting the PERPLEXITY_API_KEY environment variable"
|
|
253
253
|
)
|
|
254
|
-
self.
|
|
254
|
+
self.api_key = api_key
|
|
255
255
|
|
|
256
256
|
if base_url is None:
|
|
257
257
|
base_url = os.environ.get("PERPLEXITY_BASE_URL")
|
|
@@ -281,8 +281,8 @@ class AsyncPerplexity(AsyncAPIClient):
|
|
|
281
281
|
@property
|
|
282
282
|
@override
|
|
283
283
|
def auth_headers(self) -> dict[str, str]:
|
|
284
|
-
|
|
285
|
-
return {"Authorization": f"Bearer {
|
|
284
|
+
api_key = self.api_key
|
|
285
|
+
return {"Authorization": f"Bearer {api_key}"}
|
|
286
286
|
|
|
287
287
|
@property
|
|
288
288
|
@override
|
|
@@ -296,7 +296,7 @@ class AsyncPerplexity(AsyncAPIClient):
|
|
|
296
296
|
def copy(
|
|
297
297
|
self,
|
|
298
298
|
*,
|
|
299
|
-
|
|
299
|
+
api_key: str | None = None,
|
|
300
300
|
base_url: str | httpx.URL | None = None,
|
|
301
301
|
timeout: float | Timeout | None | NotGiven = NOT_GIVEN,
|
|
302
302
|
http_client: httpx.AsyncClient | None = None,
|
|
@@ -330,7 +330,7 @@ class AsyncPerplexity(AsyncAPIClient):
|
|
|
330
330
|
|
|
331
331
|
http_client = http_client or self._client
|
|
332
332
|
return self.__class__(
|
|
333
|
-
|
|
333
|
+
api_key=api_key or self.api_key,
|
|
334
334
|
base_url=base_url or self.base_url,
|
|
335
335
|
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
|
|
336
336
|
http_client=http_client,
|
|
@@ -45,7 +45,7 @@ def pytest_collection_modifyitems(items: list[pytest.Function]) -> None:
|
|
|
45
45
|
|
|
46
46
|
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
api_key = "My API Key"
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
@pytest.fixture(scope="session")
|
|
@@ -54,7 +54,7 @@ def client(request: FixtureRequest) -> Iterator[Perplexity]:
|
|
|
54
54
|
if not isinstance(strict, bool):
|
|
55
55
|
raise TypeError(f"Unexpected fixture parameter type {type(strict)}, expected {bool}")
|
|
56
56
|
|
|
57
|
-
with Perplexity(base_url=base_url,
|
|
57
|
+
with Perplexity(base_url=base_url, api_key=api_key, _strict_response_validation=strict) as client:
|
|
58
58
|
yield client
|
|
59
59
|
|
|
60
60
|
|
|
@@ -79,6 +79,6 @@ async def async_client(request: FixtureRequest) -> AsyncIterator[AsyncPerplexity
|
|
|
79
79
|
raise TypeError(f"Unexpected fixture parameter type {type(param)}, expected bool or dict")
|
|
80
80
|
|
|
81
81
|
async with AsyncPerplexity(
|
|
82
|
-
base_url=base_url,
|
|
82
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=strict, http_client=http_client
|
|
83
83
|
) as client:
|
|
84
84
|
yield client
|
|
@@ -37,7 +37,7 @@ from perplexity._base_client import (
|
|
|
37
37
|
from .utils import update_env
|
|
38
38
|
|
|
39
39
|
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
|
|
40
|
-
|
|
40
|
+
api_key = "My API Key"
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def _get_params(client: BaseClient[Any, Any]) -> dict[str, str]:
|
|
@@ -59,7 +59,7 @@ def _get_open_connections(client: Perplexity | AsyncPerplexity) -> int:
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
class TestPerplexity:
|
|
62
|
-
client = Perplexity(base_url=base_url,
|
|
62
|
+
client = Perplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
63
63
|
|
|
64
64
|
@pytest.mark.respx(base_url=base_url)
|
|
65
65
|
def test_raw_response(self, respx_mock: MockRouter) -> None:
|
|
@@ -85,9 +85,9 @@ class TestPerplexity:
|
|
|
85
85
|
copied = self.client.copy()
|
|
86
86
|
assert id(copied) != id(self.client)
|
|
87
87
|
|
|
88
|
-
copied = self.client.copy(
|
|
89
|
-
assert copied.
|
|
90
|
-
assert self.client.
|
|
88
|
+
copied = self.client.copy(api_key="another My API Key")
|
|
89
|
+
assert copied.api_key == "another My API Key"
|
|
90
|
+
assert self.client.api_key == "My API Key"
|
|
91
91
|
|
|
92
92
|
def test_copy_default_options(self) -> None:
|
|
93
93
|
# options that have a default are overridden correctly
|
|
@@ -107,10 +107,7 @@ class TestPerplexity:
|
|
|
107
107
|
|
|
108
108
|
def test_copy_default_headers(self) -> None:
|
|
109
109
|
client = Perplexity(
|
|
110
|
-
base_url=base_url,
|
|
111
|
-
bearer_token=bearer_token,
|
|
112
|
-
_strict_response_validation=True,
|
|
113
|
-
default_headers={"X-Foo": "bar"},
|
|
110
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
|
|
114
111
|
)
|
|
115
112
|
assert client.default_headers["X-Foo"] == "bar"
|
|
116
113
|
|
|
@@ -144,7 +141,7 @@ class TestPerplexity:
|
|
|
144
141
|
|
|
145
142
|
def test_copy_default_query(self) -> None:
|
|
146
143
|
client = Perplexity(
|
|
147
|
-
base_url=base_url,
|
|
144
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"foo": "bar"}
|
|
148
145
|
)
|
|
149
146
|
assert _get_params(client)["foo"] == "bar"
|
|
150
147
|
|
|
@@ -270,7 +267,7 @@ class TestPerplexity:
|
|
|
270
267
|
|
|
271
268
|
def test_client_timeout_option(self) -> None:
|
|
272
269
|
client = Perplexity(
|
|
273
|
-
base_url=base_url,
|
|
270
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, timeout=httpx.Timeout(0)
|
|
274
271
|
)
|
|
275
272
|
|
|
276
273
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
@@ -281,7 +278,7 @@ class TestPerplexity:
|
|
|
281
278
|
# custom timeout given to the httpx client should be used
|
|
282
279
|
with httpx.Client(timeout=None) as http_client:
|
|
283
280
|
client = Perplexity(
|
|
284
|
-
base_url=base_url,
|
|
281
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
|
|
285
282
|
)
|
|
286
283
|
|
|
287
284
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
@@ -291,7 +288,7 @@ class TestPerplexity:
|
|
|
291
288
|
# no timeout given to the httpx client should not use the httpx default
|
|
292
289
|
with httpx.Client() as http_client:
|
|
293
290
|
client = Perplexity(
|
|
294
|
-
base_url=base_url,
|
|
291
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
|
|
295
292
|
)
|
|
296
293
|
|
|
297
294
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
@@ -301,7 +298,7 @@ class TestPerplexity:
|
|
|
301
298
|
# explicitly passing the default timeout currently results in it being ignored
|
|
302
299
|
with httpx.Client(timeout=HTTPX_DEFAULT_TIMEOUT) as http_client:
|
|
303
300
|
client = Perplexity(
|
|
304
|
-
base_url=base_url,
|
|
301
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
|
|
305
302
|
)
|
|
306
303
|
|
|
307
304
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
@@ -313,17 +310,14 @@ class TestPerplexity:
|
|
|
313
310
|
async with httpx.AsyncClient() as http_client:
|
|
314
311
|
Perplexity(
|
|
315
312
|
base_url=base_url,
|
|
316
|
-
|
|
313
|
+
api_key=api_key,
|
|
317
314
|
_strict_response_validation=True,
|
|
318
315
|
http_client=cast(Any, http_client),
|
|
319
316
|
)
|
|
320
317
|
|
|
321
318
|
def test_default_headers_option(self) -> None:
|
|
322
319
|
client = Perplexity(
|
|
323
|
-
base_url=base_url,
|
|
324
|
-
bearer_token=bearer_token,
|
|
325
|
-
_strict_response_validation=True,
|
|
326
|
-
default_headers={"X-Foo": "bar"},
|
|
320
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
|
|
327
321
|
)
|
|
328
322
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
329
323
|
assert request.headers.get("x-foo") == "bar"
|
|
@@ -331,7 +325,7 @@ class TestPerplexity:
|
|
|
331
325
|
|
|
332
326
|
client2 = Perplexity(
|
|
333
327
|
base_url=base_url,
|
|
334
|
-
|
|
328
|
+
api_key=api_key,
|
|
335
329
|
_strict_response_validation=True,
|
|
336
330
|
default_headers={
|
|
337
331
|
"X-Foo": "stainless",
|
|
@@ -343,21 +337,18 @@ class TestPerplexity:
|
|
|
343
337
|
assert request.headers.get("x-stainless-lang") == "my-overriding-header"
|
|
344
338
|
|
|
345
339
|
def test_validate_headers(self) -> None:
|
|
346
|
-
client = Perplexity(base_url=base_url,
|
|
340
|
+
client = Perplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
347
341
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
348
|
-
assert request.headers.get("Authorization") == f"Bearer {
|
|
342
|
+
assert request.headers.get("Authorization") == f"Bearer {api_key}"
|
|
349
343
|
|
|
350
344
|
with pytest.raises(PerplexityError):
|
|
351
345
|
with update_env(**{"PERPLEXITY_API_KEY": Omit()}):
|
|
352
|
-
client2 = Perplexity(base_url=base_url,
|
|
346
|
+
client2 = Perplexity(base_url=base_url, api_key=None, _strict_response_validation=True)
|
|
353
347
|
_ = client2
|
|
354
348
|
|
|
355
349
|
def test_default_query_option(self) -> None:
|
|
356
350
|
client = Perplexity(
|
|
357
|
-
base_url=base_url,
|
|
358
|
-
bearer_token=bearer_token,
|
|
359
|
-
_strict_response_validation=True,
|
|
360
|
-
default_query={"query_param": "bar"},
|
|
351
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"query_param": "bar"}
|
|
361
352
|
)
|
|
362
353
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
363
354
|
url = httpx.URL(request.url)
|
|
@@ -557,9 +548,7 @@ class TestPerplexity:
|
|
|
557
548
|
assert response.foo == 2
|
|
558
549
|
|
|
559
550
|
def test_base_url_setter(self) -> None:
|
|
560
|
-
client = Perplexity(
|
|
561
|
-
base_url="https://example.com/from_init", bearer_token=bearer_token, _strict_response_validation=True
|
|
562
|
-
)
|
|
551
|
+
client = Perplexity(base_url="https://example.com/from_init", api_key=api_key, _strict_response_validation=True)
|
|
563
552
|
assert client.base_url == "https://example.com/from_init/"
|
|
564
553
|
|
|
565
554
|
client.base_url = "https://example.com/from_setter" # type: ignore[assignment]
|
|
@@ -568,20 +557,18 @@ class TestPerplexity:
|
|
|
568
557
|
|
|
569
558
|
def test_base_url_env(self) -> None:
|
|
570
559
|
with update_env(PERPLEXITY_BASE_URL="http://localhost:5000/from/env"):
|
|
571
|
-
client = Perplexity(
|
|
560
|
+
client = Perplexity(api_key=api_key, _strict_response_validation=True)
|
|
572
561
|
assert client.base_url == "http://localhost:5000/from/env/"
|
|
573
562
|
|
|
574
563
|
@pytest.mark.parametrize(
|
|
575
564
|
"client",
|
|
576
565
|
[
|
|
577
566
|
Perplexity(
|
|
578
|
-
base_url="http://localhost:5000/custom/path/",
|
|
579
|
-
bearer_token=bearer_token,
|
|
580
|
-
_strict_response_validation=True,
|
|
567
|
+
base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
|
|
581
568
|
),
|
|
582
569
|
Perplexity(
|
|
583
570
|
base_url="http://localhost:5000/custom/path/",
|
|
584
|
-
|
|
571
|
+
api_key=api_key,
|
|
585
572
|
_strict_response_validation=True,
|
|
586
573
|
http_client=httpx.Client(),
|
|
587
574
|
),
|
|
@@ -602,13 +589,11 @@ class TestPerplexity:
|
|
|
602
589
|
"client",
|
|
603
590
|
[
|
|
604
591
|
Perplexity(
|
|
605
|
-
base_url="http://localhost:5000/custom/path/",
|
|
606
|
-
bearer_token=bearer_token,
|
|
607
|
-
_strict_response_validation=True,
|
|
592
|
+
base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
|
|
608
593
|
),
|
|
609
594
|
Perplexity(
|
|
610
595
|
base_url="http://localhost:5000/custom/path/",
|
|
611
|
-
|
|
596
|
+
api_key=api_key,
|
|
612
597
|
_strict_response_validation=True,
|
|
613
598
|
http_client=httpx.Client(),
|
|
614
599
|
),
|
|
@@ -629,13 +614,11 @@ class TestPerplexity:
|
|
|
629
614
|
"client",
|
|
630
615
|
[
|
|
631
616
|
Perplexity(
|
|
632
|
-
base_url="http://localhost:5000/custom/path/",
|
|
633
|
-
bearer_token=bearer_token,
|
|
634
|
-
_strict_response_validation=True,
|
|
617
|
+
base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
|
|
635
618
|
),
|
|
636
619
|
Perplexity(
|
|
637
620
|
base_url="http://localhost:5000/custom/path/",
|
|
638
|
-
|
|
621
|
+
api_key=api_key,
|
|
639
622
|
_strict_response_validation=True,
|
|
640
623
|
http_client=httpx.Client(),
|
|
641
624
|
),
|
|
@@ -653,7 +636,7 @@ class TestPerplexity:
|
|
|
653
636
|
assert request.url == "https://myapi.com/foo"
|
|
654
637
|
|
|
655
638
|
def test_copied_client_does_not_close_http(self) -> None:
|
|
656
|
-
client = Perplexity(base_url=base_url,
|
|
639
|
+
client = Perplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
657
640
|
assert not client.is_closed()
|
|
658
641
|
|
|
659
642
|
copied = client.copy()
|
|
@@ -664,7 +647,7 @@ class TestPerplexity:
|
|
|
664
647
|
assert not client.is_closed()
|
|
665
648
|
|
|
666
649
|
def test_client_context_manager(self) -> None:
|
|
667
|
-
client = Perplexity(base_url=base_url,
|
|
650
|
+
client = Perplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
668
651
|
with client as c2:
|
|
669
652
|
assert c2 is client
|
|
670
653
|
assert not c2.is_closed()
|
|
@@ -686,10 +669,7 @@ class TestPerplexity:
|
|
|
686
669
|
def test_client_max_retries_validation(self) -> None:
|
|
687
670
|
with pytest.raises(TypeError, match=r"max_retries cannot be None"):
|
|
688
671
|
Perplexity(
|
|
689
|
-
base_url=base_url,
|
|
690
|
-
bearer_token=bearer_token,
|
|
691
|
-
_strict_response_validation=True,
|
|
692
|
-
max_retries=cast(Any, None),
|
|
672
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, max_retries=cast(Any, None)
|
|
693
673
|
)
|
|
694
674
|
|
|
695
675
|
@pytest.mark.respx(base_url=base_url)
|
|
@@ -699,12 +679,12 @@ class TestPerplexity:
|
|
|
699
679
|
|
|
700
680
|
respx_mock.get("/foo").mock(return_value=httpx.Response(200, text="my-custom-format"))
|
|
701
681
|
|
|
702
|
-
strict_client = Perplexity(base_url=base_url,
|
|
682
|
+
strict_client = Perplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
703
683
|
|
|
704
684
|
with pytest.raises(APIResponseValidationError):
|
|
705
685
|
strict_client.get("/foo", cast_to=Model)
|
|
706
686
|
|
|
707
|
-
client = Perplexity(base_url=base_url,
|
|
687
|
+
client = Perplexity(base_url=base_url, api_key=api_key, _strict_response_validation=False)
|
|
708
688
|
|
|
709
689
|
response = client.get("/foo", cast_to=Model)
|
|
710
690
|
assert isinstance(response, str) # type: ignore[unreachable]
|
|
@@ -732,7 +712,7 @@ class TestPerplexity:
|
|
|
732
712
|
)
|
|
733
713
|
@mock.patch("time.time", mock.MagicMock(return_value=1696004797))
|
|
734
714
|
def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str, timeout: float) -> None:
|
|
735
|
-
client = Perplexity(base_url=base_url,
|
|
715
|
+
client = Perplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
736
716
|
|
|
737
717
|
headers = httpx.Headers({"retry-after": retry_after})
|
|
738
718
|
options = FinalRequestOptions(method="get", url="/foo", max_retries=3)
|
|
@@ -890,7 +870,7 @@ class TestPerplexity:
|
|
|
890
870
|
|
|
891
871
|
|
|
892
872
|
class TestAsyncPerplexity:
|
|
893
|
-
client = AsyncPerplexity(base_url=base_url,
|
|
873
|
+
client = AsyncPerplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
894
874
|
|
|
895
875
|
@pytest.mark.respx(base_url=base_url)
|
|
896
876
|
@pytest.mark.asyncio
|
|
@@ -918,9 +898,9 @@ class TestAsyncPerplexity:
|
|
|
918
898
|
copied = self.client.copy()
|
|
919
899
|
assert id(copied) != id(self.client)
|
|
920
900
|
|
|
921
|
-
copied = self.client.copy(
|
|
922
|
-
assert copied.
|
|
923
|
-
assert self.client.
|
|
901
|
+
copied = self.client.copy(api_key="another My API Key")
|
|
902
|
+
assert copied.api_key == "another My API Key"
|
|
903
|
+
assert self.client.api_key == "My API Key"
|
|
924
904
|
|
|
925
905
|
def test_copy_default_options(self) -> None:
|
|
926
906
|
# options that have a default are overridden correctly
|
|
@@ -940,10 +920,7 @@ class TestAsyncPerplexity:
|
|
|
940
920
|
|
|
941
921
|
def test_copy_default_headers(self) -> None:
|
|
942
922
|
client = AsyncPerplexity(
|
|
943
|
-
base_url=base_url,
|
|
944
|
-
bearer_token=bearer_token,
|
|
945
|
-
_strict_response_validation=True,
|
|
946
|
-
default_headers={"X-Foo": "bar"},
|
|
923
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
|
|
947
924
|
)
|
|
948
925
|
assert client.default_headers["X-Foo"] == "bar"
|
|
949
926
|
|
|
@@ -977,7 +954,7 @@ class TestAsyncPerplexity:
|
|
|
977
954
|
|
|
978
955
|
def test_copy_default_query(self) -> None:
|
|
979
956
|
client = AsyncPerplexity(
|
|
980
|
-
base_url=base_url,
|
|
957
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"foo": "bar"}
|
|
981
958
|
)
|
|
982
959
|
assert _get_params(client)["foo"] == "bar"
|
|
983
960
|
|
|
@@ -1103,7 +1080,7 @@ class TestAsyncPerplexity:
|
|
|
1103
1080
|
|
|
1104
1081
|
async def test_client_timeout_option(self) -> None:
|
|
1105
1082
|
client = AsyncPerplexity(
|
|
1106
|
-
base_url=base_url,
|
|
1083
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, timeout=httpx.Timeout(0)
|
|
1107
1084
|
)
|
|
1108
1085
|
|
|
1109
1086
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
@@ -1114,7 +1091,7 @@ class TestAsyncPerplexity:
|
|
|
1114
1091
|
# custom timeout given to the httpx client should be used
|
|
1115
1092
|
async with httpx.AsyncClient(timeout=None) as http_client:
|
|
1116
1093
|
client = AsyncPerplexity(
|
|
1117
|
-
base_url=base_url,
|
|
1094
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
|
|
1118
1095
|
)
|
|
1119
1096
|
|
|
1120
1097
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
@@ -1124,7 +1101,7 @@ class TestAsyncPerplexity:
|
|
|
1124
1101
|
# no timeout given to the httpx client should not use the httpx default
|
|
1125
1102
|
async with httpx.AsyncClient() as http_client:
|
|
1126
1103
|
client = AsyncPerplexity(
|
|
1127
|
-
base_url=base_url,
|
|
1104
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
|
|
1128
1105
|
)
|
|
1129
1106
|
|
|
1130
1107
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
@@ -1134,7 +1111,7 @@ class TestAsyncPerplexity:
|
|
|
1134
1111
|
# explicitly passing the default timeout currently results in it being ignored
|
|
1135
1112
|
async with httpx.AsyncClient(timeout=HTTPX_DEFAULT_TIMEOUT) as http_client:
|
|
1136
1113
|
client = AsyncPerplexity(
|
|
1137
|
-
base_url=base_url,
|
|
1114
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
|
|
1138
1115
|
)
|
|
1139
1116
|
|
|
1140
1117
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
@@ -1146,17 +1123,14 @@ class TestAsyncPerplexity:
|
|
|
1146
1123
|
with httpx.Client() as http_client:
|
|
1147
1124
|
AsyncPerplexity(
|
|
1148
1125
|
base_url=base_url,
|
|
1149
|
-
|
|
1126
|
+
api_key=api_key,
|
|
1150
1127
|
_strict_response_validation=True,
|
|
1151
1128
|
http_client=cast(Any, http_client),
|
|
1152
1129
|
)
|
|
1153
1130
|
|
|
1154
1131
|
def test_default_headers_option(self) -> None:
|
|
1155
1132
|
client = AsyncPerplexity(
|
|
1156
|
-
base_url=base_url,
|
|
1157
|
-
bearer_token=bearer_token,
|
|
1158
|
-
_strict_response_validation=True,
|
|
1159
|
-
default_headers={"X-Foo": "bar"},
|
|
1133
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
|
|
1160
1134
|
)
|
|
1161
1135
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
1162
1136
|
assert request.headers.get("x-foo") == "bar"
|
|
@@ -1164,7 +1138,7 @@ class TestAsyncPerplexity:
|
|
|
1164
1138
|
|
|
1165
1139
|
client2 = AsyncPerplexity(
|
|
1166
1140
|
base_url=base_url,
|
|
1167
|
-
|
|
1141
|
+
api_key=api_key,
|
|
1168
1142
|
_strict_response_validation=True,
|
|
1169
1143
|
default_headers={
|
|
1170
1144
|
"X-Foo": "stainless",
|
|
@@ -1176,21 +1150,18 @@ class TestAsyncPerplexity:
|
|
|
1176
1150
|
assert request.headers.get("x-stainless-lang") == "my-overriding-header"
|
|
1177
1151
|
|
|
1178
1152
|
def test_validate_headers(self) -> None:
|
|
1179
|
-
client = AsyncPerplexity(base_url=base_url,
|
|
1153
|
+
client = AsyncPerplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
1180
1154
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
1181
|
-
assert request.headers.get("Authorization") == f"Bearer {
|
|
1155
|
+
assert request.headers.get("Authorization") == f"Bearer {api_key}"
|
|
1182
1156
|
|
|
1183
1157
|
with pytest.raises(PerplexityError):
|
|
1184
1158
|
with update_env(**{"PERPLEXITY_API_KEY": Omit()}):
|
|
1185
|
-
client2 = AsyncPerplexity(base_url=base_url,
|
|
1159
|
+
client2 = AsyncPerplexity(base_url=base_url, api_key=None, _strict_response_validation=True)
|
|
1186
1160
|
_ = client2
|
|
1187
1161
|
|
|
1188
1162
|
def test_default_query_option(self) -> None:
|
|
1189
1163
|
client = AsyncPerplexity(
|
|
1190
|
-
base_url=base_url,
|
|
1191
|
-
bearer_token=bearer_token,
|
|
1192
|
-
_strict_response_validation=True,
|
|
1193
|
-
default_query={"query_param": "bar"},
|
|
1164
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"query_param": "bar"}
|
|
1194
1165
|
)
|
|
1195
1166
|
request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
|
|
1196
1167
|
url = httpx.URL(request.url)
|
|
@@ -1391,7 +1362,7 @@ class TestAsyncPerplexity:
|
|
|
1391
1362
|
|
|
1392
1363
|
def test_base_url_setter(self) -> None:
|
|
1393
1364
|
client = AsyncPerplexity(
|
|
1394
|
-
base_url="https://example.com/from_init",
|
|
1365
|
+
base_url="https://example.com/from_init", api_key=api_key, _strict_response_validation=True
|
|
1395
1366
|
)
|
|
1396
1367
|
assert client.base_url == "https://example.com/from_init/"
|
|
1397
1368
|
|
|
@@ -1401,20 +1372,18 @@ class TestAsyncPerplexity:
|
|
|
1401
1372
|
|
|
1402
1373
|
def test_base_url_env(self) -> None:
|
|
1403
1374
|
with update_env(PERPLEXITY_BASE_URL="http://localhost:5000/from/env"):
|
|
1404
|
-
client = AsyncPerplexity(
|
|
1375
|
+
client = AsyncPerplexity(api_key=api_key, _strict_response_validation=True)
|
|
1405
1376
|
assert client.base_url == "http://localhost:5000/from/env/"
|
|
1406
1377
|
|
|
1407
1378
|
@pytest.mark.parametrize(
|
|
1408
1379
|
"client",
|
|
1409
1380
|
[
|
|
1410
1381
|
AsyncPerplexity(
|
|
1411
|
-
base_url="http://localhost:5000/custom/path/",
|
|
1412
|
-
bearer_token=bearer_token,
|
|
1413
|
-
_strict_response_validation=True,
|
|
1382
|
+
base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
|
|
1414
1383
|
),
|
|
1415
1384
|
AsyncPerplexity(
|
|
1416
1385
|
base_url="http://localhost:5000/custom/path/",
|
|
1417
|
-
|
|
1386
|
+
api_key=api_key,
|
|
1418
1387
|
_strict_response_validation=True,
|
|
1419
1388
|
http_client=httpx.AsyncClient(),
|
|
1420
1389
|
),
|
|
@@ -1435,13 +1404,11 @@ class TestAsyncPerplexity:
|
|
|
1435
1404
|
"client",
|
|
1436
1405
|
[
|
|
1437
1406
|
AsyncPerplexity(
|
|
1438
|
-
base_url="http://localhost:5000/custom/path/",
|
|
1439
|
-
bearer_token=bearer_token,
|
|
1440
|
-
_strict_response_validation=True,
|
|
1407
|
+
base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
|
|
1441
1408
|
),
|
|
1442
1409
|
AsyncPerplexity(
|
|
1443
1410
|
base_url="http://localhost:5000/custom/path/",
|
|
1444
|
-
|
|
1411
|
+
api_key=api_key,
|
|
1445
1412
|
_strict_response_validation=True,
|
|
1446
1413
|
http_client=httpx.AsyncClient(),
|
|
1447
1414
|
),
|
|
@@ -1462,13 +1429,11 @@ class TestAsyncPerplexity:
|
|
|
1462
1429
|
"client",
|
|
1463
1430
|
[
|
|
1464
1431
|
AsyncPerplexity(
|
|
1465
|
-
base_url="http://localhost:5000/custom/path/",
|
|
1466
|
-
bearer_token=bearer_token,
|
|
1467
|
-
_strict_response_validation=True,
|
|
1432
|
+
base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
|
|
1468
1433
|
),
|
|
1469
1434
|
AsyncPerplexity(
|
|
1470
1435
|
base_url="http://localhost:5000/custom/path/",
|
|
1471
|
-
|
|
1436
|
+
api_key=api_key,
|
|
1472
1437
|
_strict_response_validation=True,
|
|
1473
1438
|
http_client=httpx.AsyncClient(),
|
|
1474
1439
|
),
|
|
@@ -1486,7 +1451,7 @@ class TestAsyncPerplexity:
|
|
|
1486
1451
|
assert request.url == "https://myapi.com/foo"
|
|
1487
1452
|
|
|
1488
1453
|
async def test_copied_client_does_not_close_http(self) -> None:
|
|
1489
|
-
client = AsyncPerplexity(base_url=base_url,
|
|
1454
|
+
client = AsyncPerplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
1490
1455
|
assert not client.is_closed()
|
|
1491
1456
|
|
|
1492
1457
|
copied = client.copy()
|
|
@@ -1498,7 +1463,7 @@ class TestAsyncPerplexity:
|
|
|
1498
1463
|
assert not client.is_closed()
|
|
1499
1464
|
|
|
1500
1465
|
async def test_client_context_manager(self) -> None:
|
|
1501
|
-
client = AsyncPerplexity(base_url=base_url,
|
|
1466
|
+
client = AsyncPerplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
1502
1467
|
async with client as c2:
|
|
1503
1468
|
assert c2 is client
|
|
1504
1469
|
assert not c2.is_closed()
|
|
@@ -1521,10 +1486,7 @@ class TestAsyncPerplexity:
|
|
|
1521
1486
|
async def test_client_max_retries_validation(self) -> None:
|
|
1522
1487
|
with pytest.raises(TypeError, match=r"max_retries cannot be None"):
|
|
1523
1488
|
AsyncPerplexity(
|
|
1524
|
-
base_url=base_url,
|
|
1525
|
-
bearer_token=bearer_token,
|
|
1526
|
-
_strict_response_validation=True,
|
|
1527
|
-
max_retries=cast(Any, None),
|
|
1489
|
+
base_url=base_url, api_key=api_key, _strict_response_validation=True, max_retries=cast(Any, None)
|
|
1528
1490
|
)
|
|
1529
1491
|
|
|
1530
1492
|
@pytest.mark.respx(base_url=base_url)
|
|
@@ -1535,12 +1497,12 @@ class TestAsyncPerplexity:
|
|
|
1535
1497
|
|
|
1536
1498
|
respx_mock.get("/foo").mock(return_value=httpx.Response(200, text="my-custom-format"))
|
|
1537
1499
|
|
|
1538
|
-
strict_client = AsyncPerplexity(base_url=base_url,
|
|
1500
|
+
strict_client = AsyncPerplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
1539
1501
|
|
|
1540
1502
|
with pytest.raises(APIResponseValidationError):
|
|
1541
1503
|
await strict_client.get("/foo", cast_to=Model)
|
|
1542
1504
|
|
|
1543
|
-
client = AsyncPerplexity(base_url=base_url,
|
|
1505
|
+
client = AsyncPerplexity(base_url=base_url, api_key=api_key, _strict_response_validation=False)
|
|
1544
1506
|
|
|
1545
1507
|
response = await client.get("/foo", cast_to=Model)
|
|
1546
1508
|
assert isinstance(response, str) # type: ignore[unreachable]
|
|
@@ -1569,7 +1531,7 @@ class TestAsyncPerplexity:
|
|
|
1569
1531
|
@mock.patch("time.time", mock.MagicMock(return_value=1696004797))
|
|
1570
1532
|
@pytest.mark.asyncio
|
|
1571
1533
|
async def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str, timeout: float) -> None:
|
|
1572
|
-
client = AsyncPerplexity(base_url=base_url,
|
|
1534
|
+
client = AsyncPerplexity(base_url=base_url, api_key=api_key, _strict_response_validation=True)
|
|
1573
1535
|
|
|
1574
1536
|
headers = httpx.Headers({"retry-after": retry_after})
|
|
1575
1537
|
options = FinalRequestOptions(method="get", url="/foo", max_retries=3)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|