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.

Files changed (106) hide show
  1. perplexityai-0.13.0/.release-please-manifest.json +3 -0
  2. {perplexityai-0.12.0 → perplexityai-0.13.0}/CHANGELOG.md +12 -0
  3. {perplexityai-0.12.0 → perplexityai-0.13.0}/PKG-INFO +53 -27
  4. {perplexityai-0.12.0 → perplexityai-0.13.0}/README.md +52 -26
  5. {perplexityai-0.12.0 → perplexityai-0.13.0}/api.md +4 -4
  6. {perplexityai-0.12.0 → perplexityai-0.13.0}/pyproject.toml +1 -1
  7. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_client.py +4 -0
  8. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_streaming.py +40 -2
  9. {perplexityai-0.12.0 → 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.0 → 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.0 → perplexityai-0.13.0}/src/perplexity/types/chat/__init__.py +0 -1
  15. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/chat/completion_create_params.py +15 -4
  16. perplexityai-0.12.0/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.0 → perplexityai-0.13.0}/tests/test_client.py +24 -0
  19. perplexityai-0.12.0/.release-please-manifest.json +0 -3
  20. perplexityai-0.12.0/src/perplexity/resources/chat/completions.py +0 -389
  21. perplexityai-0.12.0/src/perplexity/types/async_/chat/completion_create_response.py +0 -54
  22. perplexityai-0.12.0/src/perplexity/types/async_/chat/completion_get_response.py +0 -54
  23. perplexityai-0.12.0/tests/api_resources/chat/test_completions.py +0 -426
  24. {perplexityai-0.12.0 → perplexityai-0.13.0}/.gitignore +0 -0
  25. {perplexityai-0.12.0 → perplexityai-0.13.0}/CONTRIBUTING.md +0 -0
  26. {perplexityai-0.12.0 → perplexityai-0.13.0}/LICENSE +0 -0
  27. {perplexityai-0.12.0 → perplexityai-0.13.0}/SECURITY.md +0 -0
  28. {perplexityai-0.12.0 → perplexityai-0.13.0}/bin/check-release-environment +0 -0
  29. {perplexityai-0.12.0 → perplexityai-0.13.0}/bin/publish-pypi +0 -0
  30. {perplexityai-0.12.0 → perplexityai-0.13.0}/examples/.keep +0 -0
  31. {perplexityai-0.12.0 → perplexityai-0.13.0}/noxfile.py +0 -0
  32. {perplexityai-0.12.0 → perplexityai-0.13.0}/release-please-config.json +0 -0
  33. {perplexityai-0.12.0 → perplexityai-0.13.0}/requirements-dev.lock +0 -0
  34. {perplexityai-0.12.0 → perplexityai-0.13.0}/requirements.lock +0 -0
  35. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/__init__.py +0 -0
  36. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_base_client.py +0 -0
  37. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_compat.py +0 -0
  38. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_constants.py +0 -0
  39. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_exceptions.py +0 -0
  40. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_files.py +0 -0
  41. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_models.py +0 -0
  42. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_qs.py +0 -0
  43. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_resource.py +0 -0
  44. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_response.py +0 -0
  45. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_types.py +0 -0
  46. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/__init__.py +0 -0
  47. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_compat.py +0 -0
  48. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_datetime_parse.py +0 -0
  49. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_logs.py +0 -0
  50. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_proxy.py +0 -0
  51. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_reflection.py +0 -0
  52. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_resources_proxy.py +0 -0
  53. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_streams.py +0 -0
  54. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_sync.py +0 -0
  55. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_transform.py +0 -0
  56. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_typing.py +0 -0
  57. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/_utils/_utils.py +0 -0
  58. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/lib/.keep +0 -0
  59. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/py.typed +0 -0
  60. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/__init__.py +0 -0
  61. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/__init__.py +0 -0
  62. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/async_.py +0 -0
  63. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/__init__.py +0 -0
  64. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/chat.py +0 -0
  65. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/async_/chat/completions.py +0 -0
  66. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/chat/__init__.py +0 -0
  67. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/chat/chat.py +0 -0
  68. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/resources/search.py +0 -0
  69. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/__init__.py +0 -0
  70. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/__init__.py +0 -0
  71. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_create_params.py +0 -0
  72. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_get_params.py +0 -0
  73. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/async_/chat/completion_list_response.py +0 -0
  74. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/search_create_params.py +0 -0
  75. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/search_create_response.py +0 -0
  76. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/__init__.py +0 -0
  77. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/api_public_search_result.py +0 -0
  78. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/chat_message_input.py +0 -0
  79. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/chat_message_output.py +0 -0
  80. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/choice.py +0 -0
  81. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared/usage_info.py +0 -0
  82. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared_params/__init__.py +0 -0
  83. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared_params/api_public_search_result.py +0 -0
  84. {perplexityai-0.12.0 → perplexityai-0.13.0}/src/perplexity/types/shared_params/chat_message_input.py +0 -0
  85. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/__init__.py +0 -0
  86. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/__init__.py +0 -0
  87. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/async_/__init__.py +0 -0
  88. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/async_/chat/__init__.py +0 -0
  89. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/async_/chat/test_completions.py +0 -0
  90. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/chat/__init__.py +0 -0
  91. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/api_resources/test_search.py +0 -0
  92. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/conftest.py +0 -0
  93. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/sample_file.txt +0 -0
  94. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_deepcopy.py +0 -0
  95. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_extract_files.py +0 -0
  96. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_files.py +0 -0
  97. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_models.py +0 -0
  98. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_qs.py +0 -0
  99. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_required_args.py +0 -0
  100. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_response.py +0 -0
  101. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_streaming.py +0 -0
  102. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_transform.py +0 -0
  103. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_utils/test_datetime_parse.py +0 -0
  104. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_utils/test_proxy.py +0 -0
  105. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/test_utils/test_typing.py +0 -0
  106. {perplexityai-0.12.0 → perplexityai-0.13.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.13.0"
3
+ }
@@ -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.12.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
- completion = client.chat.completions.create(
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(completion.id)
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
- completion = await client.chat.completions.create(
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(completion.id)
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
- completion = await client.chat.completions.create(
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(completion.id)
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
- completion = client.chat.completions.create(
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(completion.debug_params)
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
- completion = client.chat.completions.create(
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(completion.id)
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
- completion = await client.chat.completions.create(
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(completion.id)
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
- completion = await client.chat.completions.create(
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(completion.id)
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
- completion = client.chat.completions.create(
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(completion.debug_params)
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.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.0"
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.0" # x-release-please-version
4
+ __version__ = "0.13.0" # x-release-please-version