perplexityai 0.12.0__tar.gz → 0.13.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.13.0/.release-please-manifest.json +3 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/CHANGELOG.md +12 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/PKG-INFO +53 -27
- {perplexityai-0.12.0 → perplexityai-0.13.0}/README.md +52 -26
- {perplexityai-0.12.0 → perplexityai-0.13.0}/api.md +4 -4
- {perplexityai-0.12.0 → perplexityai-0.13.0}/pyproject.toml +1 -1
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_client.py +4 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_streaming.py +40 -2
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_version.py +1 -1
- perplexityai-0.13.0/src/perplexity/resources/chat/completions.py +850 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/__init__.py +1 -0
- perplexityai-0.13.0/src/perplexity/types/async_/chat/completion_create_response.py +30 -0
- perplexityai-0.13.0/src/perplexity/types/async_/chat/completion_get_response.py +30 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/chat/__init__.py +0 -1
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/chat/completion_create_params.py +15 -4
- perplexityai-0.12.0/src/perplexity/types/chat/completion_create_response.py → perplexityai-0.13.0/src/perplexity/types/stream_chunk.py +6 -6
- perplexityai-0.13.0/tests/api_resources/chat/test_completions.py +832 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_client.py +24 -0
- perplexityai-0.12.0/.release-please-manifest.json +0 -3
- perplexityai-0.12.0/src/perplexity/resources/chat/completions.py +0 -389
- perplexityai-0.12.0/src/perplexity/types/async_/chat/completion_create_response.py +0 -54
- perplexityai-0.12.0/src/perplexity/types/async_/chat/completion_get_response.py +0 -54
- perplexityai-0.12.0/tests/api_resources/chat/test_completions.py +0 -426
- {perplexityai-0.12.0 → perplexityai-0.13.0}/.gitignore +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/CONTRIBUTING.md +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/LICENSE +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/SECURITY.md +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/bin/check-release-environment +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/bin/publish-pypi +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/examples/.keep +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/noxfile.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/release-please-config.json +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/requirements-dev.lock +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/requirements.lock +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_base_client.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_compat.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_constants.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_exceptions.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_files.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_models.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_qs.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_resource.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_response.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_types.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_compat.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_datetime_parse.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_logs.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_proxy.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_reflection.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_resources_proxy.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_streams.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_sync.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_transform.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_typing.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_utils.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/lib/.keep +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/py.typed +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/async_.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/chat.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/completions.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/chat/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/chat/chat.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/search.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_create_params.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_get_params.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_list_response.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/search_create_params.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/search_create_response.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/api_public_search_result.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/chat_message_input.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/chat_message_output.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/choice.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/usage_info.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared_params/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared_params/api_public_search_result.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared_params/chat_message_input.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/async_/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/async_/chat/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/async_/chat/test_completions.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/chat/__init__.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/test_search.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/conftest.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/sample_file.txt +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_deepcopy.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_extract_files.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_files.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_models.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_qs.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_required_args.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_response.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_streaming.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_transform.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_utils/test_proxy.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_utils/test_typing.py +0 -0
- {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.13.0 (2025-10-02)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v0.12.1...v0.13.0](https://github.com/perplexityai/perplexity-py/compare/v0.12.1...v0.13.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **api:** manual updates ([f92e6d7](https://github.com/perplexityai/perplexity-py/commit/f92e6d70fd638d895b60227dd33bb7641c169a4f))
|
|
10
|
+
|
|
11
|
+
## 0.12.1 (2025-09-30)
|
|
12
|
+
|
|
13
|
+
Full Changelog: [v0.12.0...v0.12.1](https://github.com/perplexityai/perplexity-py/compare/v0.12.0...v0.12.1)
|
|
14
|
+
|
|
3
15
|
## 0.12.0 (2025-09-26)
|
|
4
16
|
|
|
5
17
|
Full Changelog: [v0.11.0...v0.12.0](https://github.com/perplexityai/perplexity-py/compare/v0.11.0...v0.12.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: perplexityai
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.0
|
|
4
4
|
Summary: The official Python library for the perplexity API
|
|
5
5
|
Project-URL: Homepage, https://github.com/perplexityai/perplexity-py
|
|
6
6
|
Project-URL: Repository, https://github.com/perplexityai/perplexity-py
|
|
@@ -76,24 +76,6 @@ for result in search.results:
|
|
|
76
76
|
print(f"{result.title}: {result.url}")
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
## Content API
|
|
80
|
-
|
|
81
|
-
Extract and process content from URLs:
|
|
82
|
-
|
|
83
|
-
```python
|
|
84
|
-
from perplexity import Perplexity
|
|
85
|
-
|
|
86
|
-
client = Perplexity()
|
|
87
|
-
|
|
88
|
-
content = client.content.create(
|
|
89
|
-
urls=["https://en.wikipedia.org/wiki/Perplexity_AI"]
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
for result in content.results:
|
|
93
|
-
print(f"Title: {result.title}")
|
|
94
|
-
print(f"Content: {result.content[:200]}...")
|
|
95
|
-
```
|
|
96
|
-
|
|
97
79
|
## Chat Completions
|
|
98
80
|
|
|
99
81
|
The full API of this library can be found in [api.md](https://github.com/perplexityai/perplexity-py/tree/main/api.md).
|
|
@@ -106,7 +88,7 @@ client = Perplexity(
|
|
|
106
88
|
api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
|
|
107
89
|
)
|
|
108
90
|
|
|
109
|
-
|
|
91
|
+
stream_chunk = client.chat.completions.create(
|
|
110
92
|
messages=[
|
|
111
93
|
{
|
|
112
94
|
"role": "user",
|
|
@@ -115,7 +97,7 @@ completion = client.chat.completions.create(
|
|
|
115
97
|
],
|
|
116
98
|
model="sonar",
|
|
117
99
|
)
|
|
118
|
-
print(
|
|
100
|
+
print(stream_chunk.id)
|
|
119
101
|
```
|
|
120
102
|
|
|
121
103
|
While you can provide an `api_key` keyword argument,
|
|
@@ -138,7 +120,7 @@ client = AsyncPerplexity(
|
|
|
138
120
|
|
|
139
121
|
|
|
140
122
|
async def main() -> None:
|
|
141
|
-
|
|
123
|
+
stream_chunk = await client.chat.completions.create(
|
|
142
124
|
messages=[
|
|
143
125
|
{
|
|
144
126
|
"role": "user",
|
|
@@ -147,7 +129,7 @@ async def main() -> None:
|
|
|
147
129
|
],
|
|
148
130
|
model="sonar",
|
|
149
131
|
)
|
|
150
|
-
print(
|
|
132
|
+
print(stream_chunk.id)
|
|
151
133
|
|
|
152
134
|
|
|
153
135
|
asyncio.run(main())
|
|
@@ -179,7 +161,7 @@ async def main() -> None:
|
|
|
179
161
|
api_key="My API Key",
|
|
180
162
|
http_client=DefaultAioHttpClient(),
|
|
181
163
|
) as client:
|
|
182
|
-
|
|
164
|
+
stream_chunk = await client.chat.completions.create(
|
|
183
165
|
messages=[
|
|
184
166
|
{
|
|
185
167
|
"role": "user",
|
|
@@ -188,12 +170,56 @@ async def main() -> None:
|
|
|
188
170
|
],
|
|
189
171
|
model="sonar",
|
|
190
172
|
)
|
|
191
|
-
print(
|
|
173
|
+
print(stream_chunk.id)
|
|
192
174
|
|
|
193
175
|
|
|
194
176
|
asyncio.run(main())
|
|
195
177
|
```
|
|
196
178
|
|
|
179
|
+
## Streaming responses
|
|
180
|
+
|
|
181
|
+
We provide support for streaming responses using Server Side Events (SSE).
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
from perplexity import Perplexity
|
|
185
|
+
|
|
186
|
+
client = Perplexity()
|
|
187
|
+
|
|
188
|
+
stream = client.chat.completions.create(
|
|
189
|
+
messages=[
|
|
190
|
+
{
|
|
191
|
+
"role": "user",
|
|
192
|
+
"content": "What is the capital of France?",
|
|
193
|
+
}
|
|
194
|
+
],
|
|
195
|
+
model="sonar",
|
|
196
|
+
stream=True,
|
|
197
|
+
)
|
|
198
|
+
for stream_chunk in stream:
|
|
199
|
+
print(stream_chunk.id)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The async client uses the exact same interface.
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
from perplexity import AsyncPerplexity
|
|
206
|
+
|
|
207
|
+
client = AsyncPerplexity()
|
|
208
|
+
|
|
209
|
+
stream = await client.chat.completions.create(
|
|
210
|
+
messages=[
|
|
211
|
+
{
|
|
212
|
+
"role": "user",
|
|
213
|
+
"content": "What is the capital of France?",
|
|
214
|
+
}
|
|
215
|
+
],
|
|
216
|
+
model="sonar",
|
|
217
|
+
stream=True,
|
|
218
|
+
)
|
|
219
|
+
async for stream_chunk in stream:
|
|
220
|
+
print(stream_chunk.id)
|
|
221
|
+
```
|
|
222
|
+
|
|
197
223
|
## Using types
|
|
198
224
|
|
|
199
225
|
Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:
|
|
@@ -212,7 +238,7 @@ from perplexity import Perplexity
|
|
|
212
238
|
|
|
213
239
|
client = Perplexity()
|
|
214
240
|
|
|
215
|
-
|
|
241
|
+
stream_chunk = client.chat.completions.create(
|
|
216
242
|
messages=[
|
|
217
243
|
{
|
|
218
244
|
"content": "string",
|
|
@@ -222,7 +248,7 @@ completion = client.chat.completions.create(
|
|
|
222
248
|
model="model",
|
|
223
249
|
debug_params={},
|
|
224
250
|
)
|
|
225
|
-
print(
|
|
251
|
+
print(stream_chunk.debug_params)
|
|
226
252
|
```
|
|
227
253
|
|
|
228
254
|
## Handling errors
|
|
@@ -41,24 +41,6 @@ for result in search.results:
|
|
|
41
41
|
print(f"{result.title}: {result.url}")
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
## Content API
|
|
45
|
-
|
|
46
|
-
Extract and process content from URLs:
|
|
47
|
-
|
|
48
|
-
```python
|
|
49
|
-
from perplexity import Perplexity
|
|
50
|
-
|
|
51
|
-
client = Perplexity()
|
|
52
|
-
|
|
53
|
-
content = client.content.create(
|
|
54
|
-
urls=["https://en.wikipedia.org/wiki/Perplexity_AI"]
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
for result in content.results:
|
|
58
|
-
print(f"Title: {result.title}")
|
|
59
|
-
print(f"Content: {result.content[:200]}...")
|
|
60
|
-
```
|
|
61
|
-
|
|
62
44
|
## Chat Completions
|
|
63
45
|
|
|
64
46
|
The full API of this library can be found in [api.md](api.md).
|
|
@@ -71,7 +53,7 @@ client = Perplexity(
|
|
|
71
53
|
api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
|
|
72
54
|
)
|
|
73
55
|
|
|
74
|
-
|
|
56
|
+
stream_chunk = client.chat.completions.create(
|
|
75
57
|
messages=[
|
|
76
58
|
{
|
|
77
59
|
"role": "user",
|
|
@@ -80,7 +62,7 @@ completion = client.chat.completions.create(
|
|
|
80
62
|
],
|
|
81
63
|
model="sonar",
|
|
82
64
|
)
|
|
83
|
-
print(
|
|
65
|
+
print(stream_chunk.id)
|
|
84
66
|
```
|
|
85
67
|
|
|
86
68
|
While you can provide an `api_key` keyword argument,
|
|
@@ -103,7 +85,7 @@ client = AsyncPerplexity(
|
|
|
103
85
|
|
|
104
86
|
|
|
105
87
|
async def main() -> None:
|
|
106
|
-
|
|
88
|
+
stream_chunk = await client.chat.completions.create(
|
|
107
89
|
messages=[
|
|
108
90
|
{
|
|
109
91
|
"role": "user",
|
|
@@ -112,7 +94,7 @@ async def main() -> None:
|
|
|
112
94
|
],
|
|
113
95
|
model="sonar",
|
|
114
96
|
)
|
|
115
|
-
print(
|
|
97
|
+
print(stream_chunk.id)
|
|
116
98
|
|
|
117
99
|
|
|
118
100
|
asyncio.run(main())
|
|
@@ -144,7 +126,7 @@ async def main() -> None:
|
|
|
144
126
|
api_key="My API Key",
|
|
145
127
|
http_client=DefaultAioHttpClient(),
|
|
146
128
|
) as client:
|
|
147
|
-
|
|
129
|
+
stream_chunk = await client.chat.completions.create(
|
|
148
130
|
messages=[
|
|
149
131
|
{
|
|
150
132
|
"role": "user",
|
|
@@ -153,12 +135,56 @@ async def main() -> None:
|
|
|
153
135
|
],
|
|
154
136
|
model="sonar",
|
|
155
137
|
)
|
|
156
|
-
print(
|
|
138
|
+
print(stream_chunk.id)
|
|
157
139
|
|
|
158
140
|
|
|
159
141
|
asyncio.run(main())
|
|
160
142
|
```
|
|
161
143
|
|
|
144
|
+
## Streaming responses
|
|
145
|
+
|
|
146
|
+
We provide support for streaming responses using Server Side Events (SSE).
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
from perplexity import Perplexity
|
|
150
|
+
|
|
151
|
+
client = Perplexity()
|
|
152
|
+
|
|
153
|
+
stream = client.chat.completions.create(
|
|
154
|
+
messages=[
|
|
155
|
+
{
|
|
156
|
+
"role": "user",
|
|
157
|
+
"content": "What is the capital of France?",
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
model="sonar",
|
|
161
|
+
stream=True,
|
|
162
|
+
)
|
|
163
|
+
for stream_chunk in stream:
|
|
164
|
+
print(stream_chunk.id)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
The async client uses the exact same interface.
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
from perplexity import AsyncPerplexity
|
|
171
|
+
|
|
172
|
+
client = AsyncPerplexity()
|
|
173
|
+
|
|
174
|
+
stream = await client.chat.completions.create(
|
|
175
|
+
messages=[
|
|
176
|
+
{
|
|
177
|
+
"role": "user",
|
|
178
|
+
"content": "What is the capital of France?",
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
model="sonar",
|
|
182
|
+
stream=True,
|
|
183
|
+
)
|
|
184
|
+
async for stream_chunk in stream:
|
|
185
|
+
print(stream_chunk.id)
|
|
186
|
+
```
|
|
187
|
+
|
|
162
188
|
## Using types
|
|
163
189
|
|
|
164
190
|
Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:
|
|
@@ -177,7 +203,7 @@ from perplexity import Perplexity
|
|
|
177
203
|
|
|
178
204
|
client = Perplexity()
|
|
179
205
|
|
|
180
|
-
|
|
206
|
+
stream_chunk = client.chat.completions.create(
|
|
181
207
|
messages=[
|
|
182
208
|
{
|
|
183
209
|
"content": "string",
|
|
@@ -187,7 +213,7 @@ completion = client.chat.completions.create(
|
|
|
187
213
|
model="model",
|
|
188
214
|
debug_params={},
|
|
189
215
|
)
|
|
190
|
-
print(
|
|
216
|
+
print(stream_chunk.debug_params)
|
|
191
217
|
```
|
|
192
218
|
|
|
193
219
|
## Handling errors
|
|
@@ -12,17 +12,17 @@ from perplexity.types import (
|
|
|
12
12
|
|
|
13
13
|
# Chat
|
|
14
14
|
|
|
15
|
-
## Completions
|
|
16
|
-
|
|
17
15
|
Types:
|
|
18
16
|
|
|
19
17
|
```python
|
|
20
|
-
from perplexity.types
|
|
18
|
+
from perplexity.types import StreamChunk
|
|
21
19
|
```
|
|
22
20
|
|
|
21
|
+
## Completions
|
|
22
|
+
|
|
23
23
|
Methods:
|
|
24
24
|
|
|
25
|
-
- <code title="post /chat/completions">client.chat.completions.<a href="./src/perplexity/resources/chat/completions.py">create</a>(\*\*<a href="src/perplexity/types/chat/completion_create_params.py">params</a>) -> <a href="./src/perplexity/types/
|
|
25
|
+
- <code title="post /chat/completions">client.chat.completions.<a href="./src/perplexity/resources/chat/completions.py">create</a>(\*\*<a href="src/perplexity/types/chat/completion_create_params.py">params</a>) -> <a href="./src/perplexity/types/stream_chunk.py">StreamChunk</a></code>
|
|
26
26
|
|
|
27
27
|
# Async
|
|
28
28
|
|
|
@@ -105,6 +105,8 @@ class Perplexity(SyncAPIClient):
|
|
|
105
105
|
_strict_response_validation=_strict_response_validation,
|
|
106
106
|
)
|
|
107
107
|
|
|
108
|
+
self._default_stream_cls = Stream
|
|
109
|
+
|
|
108
110
|
self.chat = chat.ChatResource(self)
|
|
109
111
|
self.async_ = async_.AsyncResource(self)
|
|
110
112
|
self.search = search.SearchResource(self)
|
|
@@ -277,6 +279,8 @@ class AsyncPerplexity(AsyncAPIClient):
|
|
|
277
279
|
_strict_response_validation=_strict_response_validation,
|
|
278
280
|
)
|
|
279
281
|
|
|
282
|
+
self._default_stream_cls = AsyncStream
|
|
283
|
+
|
|
280
284
|
self.chat = chat.AsyncChatResource(self)
|
|
281
285
|
self.async_ = async_.AsyncAsyncResource(self)
|
|
282
286
|
self.search = search.AsyncSearchResource(self)
|
|
@@ -55,7 +55,26 @@ class Stream(Generic[_T]):
|
|
|
55
55
|
iterator = self._iter_events()
|
|
56
56
|
|
|
57
57
|
for sse in iterator:
|
|
58
|
-
|
|
58
|
+
if sse.data.startswith("[DONE]"):
|
|
59
|
+
break
|
|
60
|
+
|
|
61
|
+
if sse.event == "error":
|
|
62
|
+
body = sse.data
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
body = sse.json()
|
|
66
|
+
err_msg = f"{body}"
|
|
67
|
+
except Exception:
|
|
68
|
+
err_msg = sse.data or f"Error code: {response.status_code}"
|
|
69
|
+
|
|
70
|
+
raise self._client._make_status_error(
|
|
71
|
+
err_msg,
|
|
72
|
+
body=body,
|
|
73
|
+
response=self.response,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
if sse.event is None:
|
|
77
|
+
yield process_data(data=sse.json(), cast_to=cast_to, response=response)
|
|
59
78
|
|
|
60
79
|
# Ensure the entire stream is consumed
|
|
61
80
|
for _sse in iterator:
|
|
@@ -119,7 +138,26 @@ class AsyncStream(Generic[_T]):
|
|
|
119
138
|
iterator = self._iter_events()
|
|
120
139
|
|
|
121
140
|
async for sse in iterator:
|
|
122
|
-
|
|
141
|
+
if sse.data.startswith("[DONE]"):
|
|
142
|
+
break
|
|
143
|
+
|
|
144
|
+
if sse.event == "error":
|
|
145
|
+
body = sse.data
|
|
146
|
+
|
|
147
|
+
try:
|
|
148
|
+
body = sse.json()
|
|
149
|
+
err_msg = f"{body}"
|
|
150
|
+
except Exception:
|
|
151
|
+
err_msg = sse.data or f"Error code: {response.status_code}"
|
|
152
|
+
|
|
153
|
+
raise self._client._make_status_error(
|
|
154
|
+
err_msg,
|
|
155
|
+
body=body,
|
|
156
|
+
response=self.response,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
if sse.event is None:
|
|
160
|
+
yield process_data(data=sse.json(), cast_to=cast_to, response=response)
|
|
123
161
|
|
|
124
162
|
# Ensure the entire stream is consumed
|
|
125
163
|
async for _sse in iterator:
|