perplexityai 0.12.1__tar.gz → 0.14.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.14.0/.release-please-manifest.json +3 -0
  2. {perplexityai-0.12.1 → perplexityai-0.14.0}/CHANGELOG.md +16 -0
  3. {perplexityai-0.12.1 → perplexityai-0.14.0}/PKG-INFO +53 -9
  4. {perplexityai-0.12.1 → perplexityai-0.14.0}/README.md +52 -8
  5. {perplexityai-0.12.1 → perplexityai-0.14.0}/api.md +4 -4
  6. {perplexityai-0.12.1 → perplexityai-0.14.0}/pyproject.toml +1 -1
  7. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_client.py +4 -0
  8. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_streaming.py +40 -2
  9. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_version.py +1 -1
  10. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/async_/chat/completions.py +10 -12
  11. perplexityai-0.14.0/src/perplexity/resources/chat/completions.py +890 -0
  12. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/search.py +6 -6
  13. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/__init__.py +1 -0
  14. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/async_/chat/completion_create_params.py +9 -1
  15. perplexityai-0.14.0/src/perplexity/types/async_/chat/completion_create_response.py +30 -0
  16. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/async_/chat/completion_get_params.py +2 -0
  17. perplexityai-0.14.0/src/perplexity/types/async_/chat/completion_get_response.py +30 -0
  18. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/chat/__init__.py +0 -1
  19. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/chat/completion_create_params.py +23 -4
  20. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/search_create_params.py +1 -1
  21. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/search_create_response.py +2 -0
  22. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared/api_public_search_result.py +3 -0
  23. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared_params/api_public_search_result.py +3 -1
  24. perplexityai-0.12.1/src/perplexity/types/chat/completion_create_response.py → perplexityai-0.14.0/src/perplexity/types/stream_chunk.py +8 -8
  25. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/api_resources/async_/chat/test_completions.py +14 -0
  26. perplexityai-0.14.0/tests/api_resources/chat/test_completions.py +856 -0
  27. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/api_resources/test_search.py +2 -2
  28. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_client.py +24 -0
  29. perplexityai-0.12.1/.release-please-manifest.json +0 -3
  30. perplexityai-0.12.1/src/perplexity/resources/chat/completions.py +0 -389
  31. perplexityai-0.12.1/src/perplexity/types/async_/chat/completion_create_response.py +0 -54
  32. perplexityai-0.12.1/src/perplexity/types/async_/chat/completion_get_response.py +0 -54
  33. perplexityai-0.12.1/tests/api_resources/chat/test_completions.py +0 -426
  34. {perplexityai-0.12.1 → perplexityai-0.14.0}/.gitignore +0 -0
  35. {perplexityai-0.12.1 → perplexityai-0.14.0}/CONTRIBUTING.md +0 -0
  36. {perplexityai-0.12.1 → perplexityai-0.14.0}/LICENSE +0 -0
  37. {perplexityai-0.12.1 → perplexityai-0.14.0}/SECURITY.md +0 -0
  38. {perplexityai-0.12.1 → perplexityai-0.14.0}/bin/check-release-environment +0 -0
  39. {perplexityai-0.12.1 → perplexityai-0.14.0}/bin/publish-pypi +0 -0
  40. {perplexityai-0.12.1 → perplexityai-0.14.0}/examples/.keep +0 -0
  41. {perplexityai-0.12.1 → perplexityai-0.14.0}/noxfile.py +0 -0
  42. {perplexityai-0.12.1 → perplexityai-0.14.0}/release-please-config.json +0 -0
  43. {perplexityai-0.12.1 → perplexityai-0.14.0}/requirements-dev.lock +0 -0
  44. {perplexityai-0.12.1 → perplexityai-0.14.0}/requirements.lock +0 -0
  45. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/__init__.py +0 -0
  46. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_base_client.py +0 -0
  47. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_compat.py +0 -0
  48. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_constants.py +0 -0
  49. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_exceptions.py +0 -0
  50. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_files.py +0 -0
  51. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_models.py +0 -0
  52. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_qs.py +0 -0
  53. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_resource.py +0 -0
  54. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_response.py +0 -0
  55. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_types.py +0 -0
  56. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/__init__.py +0 -0
  57. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_compat.py +0 -0
  58. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_datetime_parse.py +0 -0
  59. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_logs.py +0 -0
  60. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_proxy.py +0 -0
  61. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_reflection.py +0 -0
  62. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_resources_proxy.py +0 -0
  63. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_streams.py +0 -0
  64. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_sync.py +0 -0
  65. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_transform.py +0 -0
  66. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_typing.py +0 -0
  67. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/_utils/_utils.py +0 -0
  68. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/lib/.keep +0 -0
  69. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/py.typed +0 -0
  70. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/__init__.py +0 -0
  71. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/async_/__init__.py +0 -0
  72. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/async_/async_.py +0 -0
  73. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/async_/chat/__init__.py +0 -0
  74. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/async_/chat/chat.py +0 -0
  75. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/chat/__init__.py +0 -0
  76. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/resources/chat/chat.py +0 -0
  77. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/async_/__init__.py +0 -0
  78. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/async_/chat/__init__.py +0 -0
  79. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/async_/chat/completion_list_response.py +0 -0
  80. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared/__init__.py +0 -0
  81. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared/chat_message_input.py +0 -0
  82. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared/chat_message_output.py +0 -0
  83. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared/choice.py +0 -0
  84. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared/usage_info.py +0 -0
  85. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared_params/__init__.py +0 -0
  86. {perplexityai-0.12.1 → perplexityai-0.14.0}/src/perplexity/types/shared_params/chat_message_input.py +0 -0
  87. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/__init__.py +0 -0
  88. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/api_resources/__init__.py +0 -0
  89. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/api_resources/async_/__init__.py +0 -0
  90. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/api_resources/async_/chat/__init__.py +0 -0
  91. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/api_resources/chat/__init__.py +0 -0
  92. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/conftest.py +0 -0
  93. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/sample_file.txt +0 -0
  94. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_deepcopy.py +0 -0
  95. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_extract_files.py +0 -0
  96. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_files.py +0 -0
  97. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_models.py +0 -0
  98. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_qs.py +0 -0
  99. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_required_args.py +0 -0
  100. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_response.py +0 -0
  101. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_streaming.py +0 -0
  102. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_transform.py +0 -0
  103. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_utils/test_datetime_parse.py +0 -0
  104. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_utils/test_proxy.py +0 -0
  105. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/test_utils/test_typing.py +0 -0
  106. {perplexityai-0.12.1 → perplexityai-0.14.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.14.0"
3
+ }
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.0 (2025-10-08)
4
+
5
+ Full Changelog: [v0.13.0...v0.14.0](https://github.com/perplexityai/perplexity-py/compare/v0.13.0...v0.14.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** manual updates ([6c510ea](https://github.com/perplexityai/perplexity-py/commit/6c510eaf7239b14380059214d2fdb65fe2048d5c))
10
+
11
+ ## 0.13.0 (2025-10-02)
12
+
13
+ Full Changelog: [v0.12.1...v0.13.0](https://github.com/perplexityai/perplexity-py/compare/v0.12.1...v0.13.0)
14
+
15
+ ### Features
16
+
17
+ * **api:** manual updates ([f92e6d7](https://github.com/perplexityai/perplexity-py/commit/f92e6d70fd638d895b60227dd33bb7641c169a4f))
18
+
3
19
  ## 0.12.1 (2025-09-30)
4
20
 
5
21
  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.14.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.14.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.14.0" # x-release-please-version
@@ -58,10 +58,7 @@ class CompletionsResource(SyncAPIResource):
58
58
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
59
59
  ) -> CompletionCreateResponse:
60
60
  """
61
- FastAPI wrapper around async chat completions
62
-
63
- This endpoint creates an asynchronous chat completion job and returns a job ID
64
- that can be used to poll for results.
61
+ Submit an asynchronous chat completion request.
65
62
 
66
63
  Args:
67
64
  extra_headers: Send extra headers
@@ -97,7 +94,7 @@ class CompletionsResource(SyncAPIResource):
97
94
  extra_body: Body | None = None,
98
95
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
99
96
  ) -> CompletionListResponse:
100
- """list all async chat completion requests for a given user."""
97
+ """Retrieve a list of all asynchronous chat completion requests for a given user."""
101
98
  return self._get(
102
99
  "/async/chat/completions",
103
100
  options=make_request_options(
@@ -113,6 +110,7 @@ class CompletionsResource(SyncAPIResource):
113
110
  local_mode: bool | Omit = omit,
114
111
  x_client_env: str | Omit = omit,
115
112
  x_client_name: str | Omit = omit,
113
+ x_created_at_epoch_seconds: str | Omit = omit,
116
114
  x_request_time: str | Omit = omit,
117
115
  x_usage_tier: str | Omit = omit,
118
116
  x_user_id: str | Omit = omit,
@@ -124,7 +122,7 @@ class CompletionsResource(SyncAPIResource):
124
122
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
125
123
  ) -> CompletionGetResponse:
126
124
  """
127
- get the response for a given async chat completion request.
125
+ Retrieve the response for a given asynchronous chat completion request.
128
126
 
129
127
  Args:
130
128
  extra_headers: Send extra headers
@@ -142,6 +140,7 @@ class CompletionsResource(SyncAPIResource):
142
140
  {
143
141
  "x-client-env": x_client_env,
144
142
  "x-client-name": x_client_name,
143
+ "x-created-at-epoch-seconds": x_created_at_epoch_seconds,
145
144
  "x-request-time": x_request_time,
146
145
  "x-usage-tier": x_usage_tier,
147
146
  "x-user-id": x_user_id,
@@ -195,10 +194,7 @@ class AsyncCompletionsResource(AsyncAPIResource):
195
194
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
196
195
  ) -> CompletionCreateResponse:
197
196
  """
198
- FastAPI wrapper around async chat completions
199
-
200
- This endpoint creates an asynchronous chat completion job and returns a job ID
201
- that can be used to poll for results.
197
+ Submit an asynchronous chat completion request.
202
198
 
203
199
  Args:
204
200
  extra_headers: Send extra headers
@@ -234,7 +230,7 @@ class AsyncCompletionsResource(AsyncAPIResource):
234
230
  extra_body: Body | None = None,
235
231
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
236
232
  ) -> CompletionListResponse:
237
- """list all async chat completion requests for a given user."""
233
+ """Retrieve a list of all asynchronous chat completion requests for a given user."""
238
234
  return await self._get(
239
235
  "/async/chat/completions",
240
236
  options=make_request_options(
@@ -250,6 +246,7 @@ class AsyncCompletionsResource(AsyncAPIResource):
250
246
  local_mode: bool | Omit = omit,
251
247
  x_client_env: str | Omit = omit,
252
248
  x_client_name: str | Omit = omit,
249
+ x_created_at_epoch_seconds: str | Omit = omit,
253
250
  x_request_time: str | Omit = omit,
254
251
  x_usage_tier: str | Omit = omit,
255
252
  x_user_id: str | Omit = omit,
@@ -261,7 +258,7 @@ class AsyncCompletionsResource(AsyncAPIResource):
261
258
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
262
259
  ) -> CompletionGetResponse:
263
260
  """
264
- get the response for a given async chat completion request.
261
+ Retrieve the response for a given asynchronous chat completion request.
265
262
 
266
263
  Args:
267
264
  extra_headers: Send extra headers
@@ -279,6 +276,7 @@ class AsyncCompletionsResource(AsyncAPIResource):
279
276
  {
280
277
  "x-client-env": x_client_env,
281
278
  "x-client-name": x_client_name,
279
+ "x-created-at-epoch-seconds": x_created_at_epoch_seconds,
282
280
  "x-request-time": x_request_time,
283
281
  "x-usage-tier": x_usage_tier,
284
282
  "x-user-id": x_user_id,