Skip to content

Commit c629acc

Browse files
authored
Merge pull request #5 from perplexityai/release-please--branches--main--changes--next
2 parents 272f53c + 522eb84 commit c629acc

File tree

18 files changed

+1063
-115
lines changed

18 files changed

+1063
-115
lines changed

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.12.1"
2+
".": "0.13.0"
33
}

.stats.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 5
22
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/perplexity-ai%2Fperplexity-aba0c21c569842e93e17b69cae9cee58d389fce9c2482f4d251fd8727db05679.yml
33
openapi_spec_hash: 3d01b1c1425f7d43a8acf8b99bb9b321
4-
config_hash: 43831e7f153f67b8f23f7091d14db066
4+
config_hash: d7ba8374a217375f59388ce2ae8a5f90

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

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+
311
## 0.12.1 (2025-09-30)
412

513
Full Changelog: [v0.12.0...v0.12.1](https://github.com/perplexityai/perplexity-py/compare/v0.12.0...v0.12.1)

README.md

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ client = Perplexity(
5353
api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
5454
)
5555

56-
completion = client.chat.completions.create(
56+
stream_chunk = client.chat.completions.create(
5757
messages=[
5858
{
5959
"role": "user",
@@ -62,7 +62,7 @@ completion = client.chat.completions.create(
6262
],
6363
model="sonar",
6464
)
65-
print(completion.id)
65+
print(stream_chunk.id)
6666
```
6767

6868
While you can provide an `api_key` keyword argument,
@@ -85,7 +85,7 @@ client = AsyncPerplexity(
8585

8686

8787
async def main() -> None:
88-
completion = await client.chat.completions.create(
88+
stream_chunk = await client.chat.completions.create(
8989
messages=[
9090
{
9191
"role": "user",
@@ -94,7 +94,7 @@ async def main() -> None:
9494
],
9595
model="sonar",
9696
)
97-
print(completion.id)
97+
print(stream_chunk.id)
9898

9999

100100
asyncio.run(main())
@@ -126,7 +126,7 @@ async def main() -> None:
126126
api_key="My API Key",
127127
http_client=DefaultAioHttpClient(),
128128
) as client:
129-
completion = await client.chat.completions.create(
129+
stream_chunk = await client.chat.completions.create(
130130
messages=[
131131
{
132132
"role": "user",
@@ -135,12 +135,56 @@ async def main() -> None:
135135
],
136136
model="sonar",
137137
)
138-
print(completion.id)
138+
print(stream_chunk.id)
139139

140140

141141
asyncio.run(main())
142142
```
143143

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+
144188
## Using types
145189

146190
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:
@@ -159,7 +203,7 @@ from perplexity import Perplexity
159203

160204
client = Perplexity()
161205

162-
completion = client.chat.completions.create(
206+
stream_chunk = client.chat.completions.create(
163207
messages=[
164208
{
165209
"content": "string",
@@ -169,7 +213,7 @@ completion = client.chat.completions.create(
169213
model="model",
170214
debug_params={},
171215
)
172-
print(completion.debug_params)
216+
print(stream_chunk.debug_params)
173217
```
174218

175219
## Handling errors

api.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@ from perplexity.types import (
1212

1313
# Chat
1414

15-
## Completions
16-
1715
Types:
1816

1917
```python
20-
from perplexity.types.chat import CompletionCreateResponse
18+
from perplexity.types import StreamChunk
2119
```
2220

21+
## Completions
22+
2323
Methods:
2424

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/chat/completion_create_response.py">CompletionCreateResponse</a></code>
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>
2626

2727
# Async
2828

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "perplexityai"
3-
version = "0.12.1"
3+
version = "0.13.0"
44
description = "The official Python library for the perplexity API"
55
dynamic = ["readme"]
66
license = "Apache-2.0"

src/perplexity/_client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ def __init__(
105105
_strict_response_validation=_strict_response_validation,
106106
)
107107

108+
self._default_stream_cls = Stream
109+
108110
self.chat = chat.ChatResource(self)
109111
self.async_ = async_.AsyncResource(self)
110112
self.search = search.SearchResource(self)
@@ -277,6 +279,8 @@ def __init__(
277279
_strict_response_validation=_strict_response_validation,
278280
)
279281

282+
self._default_stream_cls = AsyncStream
283+
280284
self.chat = chat.AsyncChatResource(self)
281285
self.async_ = async_.AsyncAsyncResource(self)
282286
self.search = search.AsyncSearchResource(self)

src/perplexity/_streaming.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,26 @@ def __stream__(self) -> Iterator[_T]:
5555
iterator = self._iter_events()
5656

5757
for sse in iterator:
58-
yield process_data(data=sse.json(), cast_to=cast_to, response=response)
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)
5978

6079
# Ensure the entire stream is consumed
6180
for _sse in iterator:
@@ -119,7 +138,26 @@ async def __stream__(self) -> AsyncIterator[_T]:
119138
iterator = self._iter_events()
120139

121140
async for sse in iterator:
122-
yield process_data(data=sse.json(), cast_to=cast_to, response=response)
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)
123161

124162
# Ensure the entire stream is consumed
125163
async for _sse in iterator:

src/perplexity/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

33
__title__ = "perplexity"
4-
__version__ = "0.12.1" # x-release-please-version
4+
__version__ = "0.13.0" # x-release-please-version

0 commit comments

Comments
 (0)