perplexityai 0.12.1__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.

Files changed (106) hide show
  1. perplexityai-0.13.0/.release-please-manifest.json +3 -0
  2. {perplexityai-0.12.1 → perplexityai-0.13.0}/CHANGELOG.md +8 -0
  3. {perplexityai-0.12.1 → perplexityai-0.13.0}/PKG-INFO +53 -9
  4. {perplexityai-0.12.1 → perplexityai-0.13.0}/README.md +52 -8
  5. {perplexityai-0.12.1 → perplexityai-0.13.0}/api.md +4 -4
  6. {perplexityai-0.12.1 → perplexityai-0.13.0}/pyproject.toml +1 -1
  7. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_client.py +4 -0
  8. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_streaming.py +40 -2
  9. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_version.py +1 -1
  10. perplexityai-0.13.0/src/perplexity/resources/chat/completions.py +850 -0
  11. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/__init__.py +1 -0
  12. perplexityai-0.13.0/src/perplexity/types/async_/chat/completion_create_response.py +30 -0
  13. perplexityai-0.13.0/src/perplexity/types/async_/chat/completion_get_response.py +30 -0
  14. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/chat/__init__.py +0 -1
  15. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/chat/completion_create_params.py +15 -4
  16. perplexityai-0.12.1/src/perplexity/types/chat/completion_create_response.py → perplexityai-0.13.0/src/perplexity/types/stream_chunk.py +6 -6
  17. perplexityai-0.13.0/tests/api_resources/chat/test_completions.py +832 -0
  18. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_client.py +24 -0
  19. perplexityai-0.12.1/.release-please-manifest.json +0 -3
  20. perplexityai-0.12.1/src/perplexity/resources/chat/completions.py +0 -389
  21. perplexityai-0.12.1/src/perplexity/types/async_/chat/completion_create_response.py +0 -54
  22. perplexityai-0.12.1/src/perplexity/types/async_/chat/completion_get_response.py +0 -54
  23. perplexityai-0.12.1/tests/api_resources/chat/test_completions.py +0 -426
  24. {perplexityai-0.12.1 → perplexityai-0.13.0}/.gitignore +0 -0
  25. {perplexityai-0.12.1 → perplexityai-0.13.0}/CONTRIBUTING.md +0 -0
  26. {perplexityai-0.12.1 → perplexityai-0.13.0}/LICENSE +0 -0
  27. {perplexityai-0.12.1 → perplexityai-0.13.0}/SECURITY.md +0 -0
  28. {perplexityai-0.12.1 → perplexityai-0.13.0}/bin/check-release-environment +0 -0
  29. {perplexityai-0.12.1 → perplexityai-0.13.0}/bin/publish-pypi +0 -0
  30. {perplexityai-0.12.1 → perplexityai-0.13.0}/examples/.keep +0 -0
  31. {perplexityai-0.12.1 → perplexityai-0.13.0}/noxfile.py +0 -0
  32. {perplexityai-0.12.1 → perplexityai-0.13.0}/release-please-config.json +0 -0
  33. {perplexityai-0.12.1 → perplexityai-0.13.0}/requirements-dev.lock +0 -0
  34. {perplexityai-0.12.1 → perplexityai-0.13.0}/requirements.lock +0 -0
  35. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/__init__.py +0 -0
  36. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_base_client.py +0 -0
  37. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_compat.py +0 -0
  38. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_constants.py +0 -0
  39. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_exceptions.py +0 -0
  40. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_files.py +0 -0
  41. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_models.py +0 -0
  42. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_qs.py +0 -0
  43. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_resource.py +0 -0
  44. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_response.py +0 -0
  45. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_types.py +0 -0
  46. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/__init__.py +0 -0
  47. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_compat.py +0 -0
  48. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_datetime_parse.py +0 -0
  49. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_logs.py +0 -0
  50. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_proxy.py +0 -0
  51. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_reflection.py +0 -0
  52. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_resources_proxy.py +0 -0
  53. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_streams.py +0 -0
  54. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_sync.py +0 -0
  55. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_transform.py +0 -0
  56. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_typing.py +0 -0
  57. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/_utils/_utils.py +0 -0
  58. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/lib/.keep +0 -0
  59. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/py.typed +0 -0
  60. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/__init__.py +0 -0
  61. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/async_/__init__.py +0 -0
  62. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/async_/async_.py +0 -0
  63. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/__init__.py +0 -0
  64. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/chat.py +0 -0
  65. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/completions.py +0 -0
  66. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/chat/__init__.py +0 -0
  67. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/chat/chat.py +0 -0
  68. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/resources/search.py +0 -0
  69. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/async_/__init__.py +0 -0
  70. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/__init__.py +0 -0
  71. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_create_params.py +0 -0
  72. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_get_params.py +0 -0
  73. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_list_response.py +0 -0
  74. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/search_create_params.py +0 -0
  75. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/search_create_response.py +0 -0
  76. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared/__init__.py +0 -0
  77. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared/api_public_search_result.py +0 -0
  78. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared/chat_message_input.py +0 -0
  79. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared/chat_message_output.py +0 -0
  80. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared/choice.py +0 -0
  81. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared/usage_info.py +0 -0
  82. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared_params/__init__.py +0 -0
  83. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared_params/api_public_search_result.py +0 -0
  84. {perplexityai-0.12.1 → perplexityai-0.13.0}/src/perplexity/types/shared_params/chat_message_input.py +0 -0
  85. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/__init__.py +0 -0
  86. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/api_resources/__init__.py +0 -0
  87. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/api_resources/async_/__init__.py +0 -0
  88. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/api_resources/async_/chat/__init__.py +0 -0
  89. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/api_resources/async_/chat/test_completions.py +0 -0
  90. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/api_resources/chat/__init__.py +0 -0
  91. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/api_resources/test_search.py +0 -0
  92. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/conftest.py +0 -0
  93. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/sample_file.txt +0 -0
  94. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_deepcopy.py +0 -0
  95. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_extract_files.py +0 -0
  96. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_files.py +0 -0
  97. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_models.py +0 -0
  98. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_qs.py +0 -0
  99. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_required_args.py +0 -0
  100. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_response.py +0 -0
  101. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_streaming.py +0 -0
  102. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_transform.py +0 -0
  103. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_utils/test_datetime_parse.py +0 -0
  104. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_utils/test_proxy.py +0 -0
  105. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/test_utils/test_typing.py +0 -0
  106. {perplexityai-0.12.1 → perplexityai-0.13.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.13.0"
3
+ }
@@ -1,5 +1,13 @@
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
+
3
11
  ## 0.12.1 (2025-09-30)
4
12
 
5
13
  Full Changelog: [v0.12.0...v0.12.1](https://github.com/perplexityai/perplexity-py/compare/v0.12.0...v0.12.1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: perplexityai
3
- Version: 0.12.1
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
@@ -88,7 +88,7 @@ client = Perplexity(
88
88
  api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
89
89
  )
90
90
 
91
- completion = client.chat.completions.create(
91
+ stream_chunk = client.chat.completions.create(
92
92
  messages=[
93
93
  {
94
94
  "role": "user",
@@ -97,7 +97,7 @@ completion = client.chat.completions.create(
97
97
  ],
98
98
  model="sonar",
99
99
  )
100
- print(completion.id)
100
+ print(stream_chunk.id)
101
101
  ```
102
102
 
103
103
  While you can provide an `api_key` keyword argument,
@@ -120,7 +120,7 @@ client = AsyncPerplexity(
120
120
 
121
121
 
122
122
  async def main() -> None:
123
- completion = await client.chat.completions.create(
123
+ stream_chunk = await client.chat.completions.create(
124
124
  messages=[
125
125
  {
126
126
  "role": "user",
@@ -129,7 +129,7 @@ async def main() -> None:
129
129
  ],
130
130
  model="sonar",
131
131
  )
132
- print(completion.id)
132
+ print(stream_chunk.id)
133
133
 
134
134
 
135
135
  asyncio.run(main())
@@ -161,7 +161,7 @@ async def main() -> None:
161
161
  api_key="My API Key",
162
162
  http_client=DefaultAioHttpClient(),
163
163
  ) as client:
164
- completion = await client.chat.completions.create(
164
+ stream_chunk = await client.chat.completions.create(
165
165
  messages=[
166
166
  {
167
167
  "role": "user",
@@ -170,12 +170,56 @@ async def main() -> None:
170
170
  ],
171
171
  model="sonar",
172
172
  )
173
- print(completion.id)
173
+ print(stream_chunk.id)
174
174
 
175
175
 
176
176
  asyncio.run(main())
177
177
  ```
178
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
+
179
223
  ## Using types
180
224
 
181
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:
@@ -194,7 +238,7 @@ from perplexity import Perplexity
194
238
 
195
239
  client = Perplexity()
196
240
 
197
- completion = client.chat.completions.create(
241
+ stream_chunk = client.chat.completions.create(
198
242
  messages=[
199
243
  {
200
244
  "content": "string",
@@ -204,7 +248,7 @@ completion = client.chat.completions.create(
204
248
  model="model",
205
249
  debug_params={},
206
250
  )
207
- print(completion.debug_params)
251
+ print(stream_chunk.debug_params)
208
252
  ```
209
253
 
210
254
  ## Handling errors
@@ -53,7 +53,7 @@ client = Perplexity(
53
53
  api_key=os.environ.get("PERPLEXITY_API_KEY"), # This is the default and can be omitted
54
54
  )
55
55
 
56
- completion = client.chat.completions.create(
56
+ stream_chunk = client.chat.completions.create(
57
57
  messages=[
58
58
  {
59
59
  "role": "user",
@@ -62,7 +62,7 @@ completion = client.chat.completions.create(
62
62
  ],
63
63
  model="sonar",
64
64
  )
65
- print(completion.id)
65
+ print(stream_chunk.id)
66
66
  ```
67
67
 
68
68
  While you can provide an `api_key` keyword argument,
@@ -85,7 +85,7 @@ client = AsyncPerplexity(
85
85
 
86
86
 
87
87
  async def main() -> None:
88
- completion = await client.chat.completions.create(
88
+ stream_chunk = await client.chat.completions.create(
89
89
  messages=[
90
90
  {
91
91
  "role": "user",
@@ -94,7 +94,7 @@ async def main() -> None:
94
94
  ],
95
95
  model="sonar",
96
96
  )
97
- print(completion.id)
97
+ print(stream_chunk.id)
98
98
 
99
99
 
100
100
  asyncio.run(main())
@@ -126,7 +126,7 @@ async def main() -> None:
126
126
  api_key="My API Key",
127
127
  http_client=DefaultAioHttpClient(),
128
128
  ) as client:
129
- completion = await client.chat.completions.create(
129
+ stream_chunk = await client.chat.completions.create(
130
130
  messages=[
131
131
  {
132
132
  "role": "user",
@@ -135,12 +135,56 @@ async def main() -> None:
135
135
  ],
136
136
  model="sonar",
137
137
  )
138
- print(completion.id)
138
+ print(stream_chunk.id)
139
139
 
140
140
 
141
141
  asyncio.run(main())
142
142
  ```
143
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
+
144
188
  ## Using types
145
189
 
146
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:
@@ -159,7 +203,7 @@ from perplexity import Perplexity
159
203
 
160
204
  client = Perplexity()
161
205
 
162
- completion = client.chat.completions.create(
206
+ stream_chunk = client.chat.completions.create(
163
207
  messages=[
164
208
  {
165
209
  "content": "string",
@@ -169,7 +213,7 @@ completion = client.chat.completions.create(
169
213
  model="model",
170
214
  debug_params={},
171
215
  )
172
- print(completion.debug_params)
216
+ print(stream_chunk.debug_params)
173
217
  ```
174
218
 
175
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.chat import CompletionCreateResponse
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/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>
26
26
 
27
27
  # Async
28
28
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "perplexityai"
3
- version = "0.12.1"
3
+ version = "0.13.0"
4
4
  description = "The official Python library for the perplexity API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -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
- 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)
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
- 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)
123
161
 
124
162
  # Ensure the entire stream is consumed
125
163
  async for _sse in iterator:
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "perplexity"
4
- __version__ = "0.12.1" # x-release-please-version
4
+ __version__ = "0.13.0" # x-release-please-version