@ai-sdk/perplexity 4.0.6 → 4.0.8
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.
- package/CHANGELOG.md +17 -0
- package/dist/index.d.ts +141 -1
- package/dist/index.js +186 -55
- package/dist/index.js.map +1 -1
- package/docs/70-perplexity.mdx +16 -24
- package/package.json +3 -3
- package/src/convert-to-perplexity-messages.ts +17 -5
- package/src/index.ts +1 -0
- package/src/perplexity-language-model-options.ts +148 -0
- package/src/perplexity-language-model.ts +13 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @ai-sdk/perplexity
|
|
2
2
|
|
|
3
|
+
## 4.0.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7927171: Fix Perplexity prompt conversion for file parts with unsupported media types and top-level PDF media types.
|
|
8
|
+
- Updated dependencies [0f93c57]
|
|
9
|
+
- @ai-sdk/provider@4.0.3
|
|
10
|
+
- @ai-sdk/provider-utils@5.0.7
|
|
11
|
+
|
|
12
|
+
## 4.0.7
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 8bc6172: feat(perplexity): add `PerplexityLanguageModelOptions` type and schema
|
|
17
|
+
- Updated dependencies [ac306ed]
|
|
18
|
+
- @ai-sdk/provider-utils@5.0.6
|
|
19
|
+
|
|
3
20
|
## 4.0.6
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ProviderV4, LanguageModelV4 } from '@ai-sdk/provider';
|
|
2
2
|
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
3
|
+
import { z } from 'zod/v4';
|
|
3
4
|
|
|
4
5
|
type PerplexityLanguageModelId = 'sonar-deep-research' | 'sonar-reasoning-pro' | 'sonar-reasoning' | 'sonar-pro' | 'sonar' | (string & {});
|
|
5
6
|
|
|
@@ -39,6 +40,145 @@ interface PerplexityProviderSettings {
|
|
|
39
40
|
declare function createPerplexity(options?: PerplexityProviderSettings): PerplexityProvider;
|
|
40
41
|
declare const perplexity: PerplexityProvider;
|
|
41
42
|
|
|
43
|
+
declare const perplexityLanguageModelOptions: z.ZodObject<{
|
|
44
|
+
/**
|
|
45
|
+
* Filters search results to those published within the specified time window.
|
|
46
|
+
* Cannot be combined with other date filters.
|
|
47
|
+
*/
|
|
48
|
+
search_recency_filter: z.ZodOptional<z.ZodEnum<{
|
|
49
|
+
hour: "hour";
|
|
50
|
+
day: "day";
|
|
51
|
+
week: "week";
|
|
52
|
+
month: "month";
|
|
53
|
+
year: "year";
|
|
54
|
+
}>>;
|
|
55
|
+
/**
|
|
56
|
+
* Restrict web search results to specific domains or URLs.
|
|
57
|
+
* Prefix a domain with "-" to exclude it.
|
|
58
|
+
*/
|
|
59
|
+
search_domain_filter: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
60
|
+
/**
|
|
61
|
+
* Filter search results by language using ISO 639-1 codes.
|
|
62
|
+
*/
|
|
63
|
+
search_language_filter: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
64
|
+
/**
|
|
65
|
+
* Return search results published after this date.
|
|
66
|
+
*/
|
|
67
|
+
search_after_date_filter: z.ZodOptional<z.ZodString>;
|
|
68
|
+
/**
|
|
69
|
+
* Return search results published before this date.
|
|
70
|
+
*/
|
|
71
|
+
search_before_date_filter: z.ZodOptional<z.ZodString>;
|
|
72
|
+
/**
|
|
73
|
+
* Return search results last updated after this date.
|
|
74
|
+
*/
|
|
75
|
+
last_updated_after_filter: z.ZodOptional<z.ZodString>;
|
|
76
|
+
/**
|
|
77
|
+
* Return search results last updated before this date.
|
|
78
|
+
*/
|
|
79
|
+
last_updated_before_filter: z.ZodOptional<z.ZodString>;
|
|
80
|
+
/**
|
|
81
|
+
* Source of search results.
|
|
82
|
+
*/
|
|
83
|
+
search_mode: z.ZodOptional<z.ZodEnum<{
|
|
84
|
+
web: "web";
|
|
85
|
+
academic: "academic";
|
|
86
|
+
sec: "sec";
|
|
87
|
+
}>>;
|
|
88
|
+
/**
|
|
89
|
+
* If true, the model decides whether web search is needed.
|
|
90
|
+
*/
|
|
91
|
+
enable_search_classifier: z.ZodOptional<z.ZodBoolean>;
|
|
92
|
+
/**
|
|
93
|
+
* If true, disables web search.
|
|
94
|
+
*/
|
|
95
|
+
disable_search: z.ZodOptional<z.ZodBoolean>;
|
|
96
|
+
/**
|
|
97
|
+
* If true, a list of related questions is included in the response.
|
|
98
|
+
*/
|
|
99
|
+
return_related_questions: z.ZodOptional<z.ZodBoolean>;
|
|
100
|
+
/**
|
|
101
|
+
* If true, image search results are included in the response.
|
|
102
|
+
*/
|
|
103
|
+
return_images: z.ZodOptional<z.ZodBoolean>;
|
|
104
|
+
/**
|
|
105
|
+
* Restrict image results to specific domains.
|
|
106
|
+
* Prefix a domain with "-" to exclude it.
|
|
107
|
+
*/
|
|
108
|
+
image_domain_filter: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
109
|
+
/**
|
|
110
|
+
* Restrict image results to specific file formats.
|
|
111
|
+
*/
|
|
112
|
+
image_format_filter: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
113
|
+
/**
|
|
114
|
+
* Additional media response configuration.
|
|
115
|
+
*/
|
|
116
|
+
media_response: z.ZodOptional<z.ZodObject<{
|
|
117
|
+
overrides: z.ZodOptional<z.ZodObject<{
|
|
118
|
+
/**
|
|
119
|
+
* If true, video results are included in the response.
|
|
120
|
+
*/
|
|
121
|
+
return_videos: z.ZodOptional<z.ZodBoolean>;
|
|
122
|
+
}, z.core.$loose>>;
|
|
123
|
+
}, z.core.$loose>>;
|
|
124
|
+
/**
|
|
125
|
+
* Controls the format of streaming events.
|
|
126
|
+
*/
|
|
127
|
+
stream_mode: z.ZodOptional<z.ZodEnum<{
|
|
128
|
+
full: "full";
|
|
129
|
+
concise: "concise";
|
|
130
|
+
}>>;
|
|
131
|
+
/**
|
|
132
|
+
* Controls how much effort the model spends on reasoning.
|
|
133
|
+
*/
|
|
134
|
+
reasoning_effort: z.ZodOptional<z.ZodEnum<{
|
|
135
|
+
minimal: "minimal";
|
|
136
|
+
low: "low";
|
|
137
|
+
medium: "medium";
|
|
138
|
+
high: "high";
|
|
139
|
+
}>>;
|
|
140
|
+
/**
|
|
141
|
+
* Preferred response language as an ISO 639-1 language code.
|
|
142
|
+
*/
|
|
143
|
+
language_preference: z.ZodOptional<z.ZodString>;
|
|
144
|
+
/**
|
|
145
|
+
* Additional web search configuration.
|
|
146
|
+
*/
|
|
147
|
+
web_search_options: z.ZodOptional<z.ZodObject<{
|
|
148
|
+
/**
|
|
149
|
+
* Controls the size of search context injected into the model.
|
|
150
|
+
*/
|
|
151
|
+
search_context_size: z.ZodOptional<z.ZodEnum<{
|
|
152
|
+
low: "low";
|
|
153
|
+
medium: "medium";
|
|
154
|
+
high: "high";
|
|
155
|
+
}>>;
|
|
156
|
+
/**
|
|
157
|
+
* Controls whether to use fast search, pro search, or automatic routing.
|
|
158
|
+
*/
|
|
159
|
+
search_type: z.ZodOptional<z.ZodEnum<{
|
|
160
|
+
fast: "fast";
|
|
161
|
+
pro: "pro";
|
|
162
|
+
auto: "auto";
|
|
163
|
+
}>>;
|
|
164
|
+
/**
|
|
165
|
+
* User location for search result personalization.
|
|
166
|
+
*/
|
|
167
|
+
user_location: z.ZodOptional<z.ZodObject<{
|
|
168
|
+
latitude: z.ZodOptional<z.ZodNumber>;
|
|
169
|
+
longitude: z.ZodOptional<z.ZodNumber>;
|
|
170
|
+
country: z.ZodOptional<z.ZodString>;
|
|
171
|
+
city: z.ZodOptional<z.ZodString>;
|
|
172
|
+
region: z.ZodOptional<z.ZodString>;
|
|
173
|
+
}, z.core.$loose>>;
|
|
174
|
+
/**
|
|
175
|
+
* If true, applies enhanced relevance filtering to image results.
|
|
176
|
+
*/
|
|
177
|
+
image_results_enhanced_relevance: z.ZodOptional<z.ZodBoolean>;
|
|
178
|
+
}, z.core.$loose>>;
|
|
179
|
+
}, z.core.$loose>;
|
|
180
|
+
type PerplexityLanguageModelOptions = z.infer<typeof perplexityLanguageModelOptions>;
|
|
181
|
+
|
|
42
182
|
declare const VERSION: string;
|
|
43
183
|
|
|
44
|
-
export { type PerplexityProvider, type PerplexityProviderSettings, VERSION, createPerplexity, perplexity };
|
|
184
|
+
export { type PerplexityLanguageModelOptions, type PerplexityProvider, type PerplexityProviderSettings, VERSION, createPerplexity, perplexity };
|
package/dist/index.js
CHANGED
|
@@ -16,12 +16,13 @@ import {
|
|
|
16
16
|
createJsonErrorResponseHandler,
|
|
17
17
|
createJsonResponseHandler,
|
|
18
18
|
isCustomReasoning,
|
|
19
|
+
parseProviderOptions,
|
|
19
20
|
postJsonToApi,
|
|
20
21
|
serializeModelOptions,
|
|
21
22
|
WORKFLOW_SERIALIZE,
|
|
22
23
|
WORKFLOW_DESERIALIZE
|
|
23
24
|
} from "@ai-sdk/provider-utils";
|
|
24
|
-
import { z } from "zod/v4";
|
|
25
|
+
import { z as z2 } from "zod/v4";
|
|
25
26
|
|
|
26
27
|
// src/convert-perplexity-usage.ts
|
|
27
28
|
function convertPerplexityUsage(usage) {
|
|
@@ -105,7 +106,16 @@ function convertToPerplexityMessages(prompt) {
|
|
|
105
106
|
}
|
|
106
107
|
case "url":
|
|
107
108
|
case "data": {
|
|
108
|
-
|
|
109
|
+
const topLevelMediaType = getTopLevelMediaType(
|
|
110
|
+
part.mediaType
|
|
111
|
+
);
|
|
112
|
+
if (topLevelMediaType === "application") {
|
|
113
|
+
const fullMediaType = resolveFullMediaType({ part });
|
|
114
|
+
if (fullMediaType !== "application/pdf") {
|
|
115
|
+
throw new UnsupportedFunctionalityError({
|
|
116
|
+
functionality: `file part media type ${fullMediaType}`
|
|
117
|
+
});
|
|
118
|
+
}
|
|
109
119
|
return part.data.type === "url" ? {
|
|
110
120
|
type: "file_url",
|
|
111
121
|
file_url: {
|
|
@@ -119,7 +129,7 @@ function convertToPerplexityMessages(prompt) {
|
|
|
119
129
|
},
|
|
120
130
|
file_name: part.filename || `document-${index}.pdf`
|
|
121
131
|
};
|
|
122
|
-
} else if (
|
|
132
|
+
} else if (topLevelMediaType === "image") {
|
|
123
133
|
return part.data.type === "url" ? {
|
|
124
134
|
type: "image_url",
|
|
125
135
|
image_url: {
|
|
@@ -132,7 +142,9 @@ function convertToPerplexityMessages(prompt) {
|
|
|
132
142
|
}
|
|
133
143
|
};
|
|
134
144
|
}
|
|
135
|
-
|
|
145
|
+
throw new UnsupportedFunctionalityError({
|
|
146
|
+
functionality: `file part media type ${part.mediaType}`
|
|
147
|
+
});
|
|
136
148
|
}
|
|
137
149
|
}
|
|
138
150
|
}
|
|
@@ -169,6 +181,120 @@ function mapPerplexityFinishReason(finishReason) {
|
|
|
169
181
|
}
|
|
170
182
|
}
|
|
171
183
|
|
|
184
|
+
// src/perplexity-language-model-options.ts
|
|
185
|
+
import { z } from "zod/v4";
|
|
186
|
+
var perplexityLanguageModelOptions = z.looseObject({
|
|
187
|
+
/**
|
|
188
|
+
* Filters search results to those published within the specified time window.
|
|
189
|
+
* Cannot be combined with other date filters.
|
|
190
|
+
*/
|
|
191
|
+
search_recency_filter: z.enum(["hour", "day", "week", "month", "year"]).optional(),
|
|
192
|
+
/**
|
|
193
|
+
* Restrict web search results to specific domains or URLs.
|
|
194
|
+
* Prefix a domain with "-" to exclude it.
|
|
195
|
+
*/
|
|
196
|
+
search_domain_filter: z.array(z.string()).optional(),
|
|
197
|
+
/**
|
|
198
|
+
* Filter search results by language using ISO 639-1 codes.
|
|
199
|
+
*/
|
|
200
|
+
search_language_filter: z.array(z.string()).optional(),
|
|
201
|
+
/**
|
|
202
|
+
* Return search results published after this date.
|
|
203
|
+
*/
|
|
204
|
+
search_after_date_filter: z.string().optional(),
|
|
205
|
+
/**
|
|
206
|
+
* Return search results published before this date.
|
|
207
|
+
*/
|
|
208
|
+
search_before_date_filter: z.string().optional(),
|
|
209
|
+
/**
|
|
210
|
+
* Return search results last updated after this date.
|
|
211
|
+
*/
|
|
212
|
+
last_updated_after_filter: z.string().optional(),
|
|
213
|
+
/**
|
|
214
|
+
* Return search results last updated before this date.
|
|
215
|
+
*/
|
|
216
|
+
last_updated_before_filter: z.string().optional(),
|
|
217
|
+
/**
|
|
218
|
+
* Source of search results.
|
|
219
|
+
*/
|
|
220
|
+
search_mode: z.enum(["web", "academic", "sec"]).optional(),
|
|
221
|
+
/**
|
|
222
|
+
* If true, the model decides whether web search is needed.
|
|
223
|
+
*/
|
|
224
|
+
enable_search_classifier: z.boolean().optional(),
|
|
225
|
+
/**
|
|
226
|
+
* If true, disables web search.
|
|
227
|
+
*/
|
|
228
|
+
disable_search: z.boolean().optional(),
|
|
229
|
+
/**
|
|
230
|
+
* If true, a list of related questions is included in the response.
|
|
231
|
+
*/
|
|
232
|
+
return_related_questions: z.boolean().optional(),
|
|
233
|
+
/**
|
|
234
|
+
* If true, image search results are included in the response.
|
|
235
|
+
*/
|
|
236
|
+
return_images: z.boolean().optional(),
|
|
237
|
+
/**
|
|
238
|
+
* Restrict image results to specific domains.
|
|
239
|
+
* Prefix a domain with "-" to exclude it.
|
|
240
|
+
*/
|
|
241
|
+
image_domain_filter: z.array(z.string()).optional(),
|
|
242
|
+
/**
|
|
243
|
+
* Restrict image results to specific file formats.
|
|
244
|
+
*/
|
|
245
|
+
image_format_filter: z.array(z.string()).optional(),
|
|
246
|
+
/**
|
|
247
|
+
* Additional media response configuration.
|
|
248
|
+
*/
|
|
249
|
+
media_response: z.looseObject({
|
|
250
|
+
overrides: z.looseObject({
|
|
251
|
+
/**
|
|
252
|
+
* If true, video results are included in the response.
|
|
253
|
+
*/
|
|
254
|
+
return_videos: z.boolean().optional()
|
|
255
|
+
}).optional()
|
|
256
|
+
}).optional(),
|
|
257
|
+
/**
|
|
258
|
+
* Controls the format of streaming events.
|
|
259
|
+
*/
|
|
260
|
+
stream_mode: z.enum(["full", "concise"]).optional(),
|
|
261
|
+
/**
|
|
262
|
+
* Controls how much effort the model spends on reasoning.
|
|
263
|
+
*/
|
|
264
|
+
reasoning_effort: z.enum(["minimal", "low", "medium", "high"]).optional(),
|
|
265
|
+
/**
|
|
266
|
+
* Preferred response language as an ISO 639-1 language code.
|
|
267
|
+
*/
|
|
268
|
+
language_preference: z.string().optional(),
|
|
269
|
+
/**
|
|
270
|
+
* Additional web search configuration.
|
|
271
|
+
*/
|
|
272
|
+
web_search_options: z.looseObject({
|
|
273
|
+
/**
|
|
274
|
+
* Controls the size of search context injected into the model.
|
|
275
|
+
*/
|
|
276
|
+
search_context_size: z.enum(["low", "medium", "high"]).optional(),
|
|
277
|
+
/**
|
|
278
|
+
* Controls whether to use fast search, pro search, or automatic routing.
|
|
279
|
+
*/
|
|
280
|
+
search_type: z.enum(["fast", "pro", "auto"]).optional(),
|
|
281
|
+
/**
|
|
282
|
+
* User location for search result personalization.
|
|
283
|
+
*/
|
|
284
|
+
user_location: z.looseObject({
|
|
285
|
+
latitude: z.number().optional(),
|
|
286
|
+
longitude: z.number().optional(),
|
|
287
|
+
country: z.string().optional(),
|
|
288
|
+
city: z.string().optional(),
|
|
289
|
+
region: z.string().optional()
|
|
290
|
+
}).optional(),
|
|
291
|
+
/**
|
|
292
|
+
* If true, applies enhanced relevance filtering to image results.
|
|
293
|
+
*/
|
|
294
|
+
image_results_enhanced_relevance: z.boolean().optional()
|
|
295
|
+
}).optional()
|
|
296
|
+
});
|
|
297
|
+
|
|
172
298
|
// src/perplexity-language-model.ts
|
|
173
299
|
var PerplexityLanguageModel = class _PerplexityLanguageModel {
|
|
174
300
|
constructor(modelId, config) {
|
|
@@ -189,7 +315,7 @@ var PerplexityLanguageModel = class _PerplexityLanguageModel {
|
|
|
189
315
|
static [WORKFLOW_DESERIALIZE](options) {
|
|
190
316
|
return new _PerplexityLanguageModel(options.modelId, options.config);
|
|
191
317
|
}
|
|
192
|
-
getArgs({
|
|
318
|
+
async getArgs({
|
|
193
319
|
prompt,
|
|
194
320
|
maxOutputTokens,
|
|
195
321
|
temperature,
|
|
@@ -205,6 +331,11 @@ var PerplexityLanguageModel = class _PerplexityLanguageModel {
|
|
|
205
331
|
}) {
|
|
206
332
|
var _a;
|
|
207
333
|
const warnings = [];
|
|
334
|
+
const perplexityOptions = (_a = await parseProviderOptions({
|
|
335
|
+
provider: "perplexity",
|
|
336
|
+
providerOptions,
|
|
337
|
+
schema: perplexityLanguageModelOptions
|
|
338
|
+
})) != null ? _a : {};
|
|
208
339
|
if (topK != null) {
|
|
209
340
|
warnings.push({ type: "unsupported", feature: "topK" });
|
|
210
341
|
}
|
|
@@ -238,7 +369,7 @@ var PerplexityLanguageModel = class _PerplexityLanguageModel {
|
|
|
238
369
|
json_schema: { schema: responseFormat.schema }
|
|
239
370
|
} : void 0,
|
|
240
371
|
// provider extensions
|
|
241
|
-
...
|
|
372
|
+
...perplexityOptions,
|
|
242
373
|
// messages:
|
|
243
374
|
messages: convertToPerplexityMessages(prompt)
|
|
244
375
|
},
|
|
@@ -247,7 +378,7 @@ var PerplexityLanguageModel = class _PerplexityLanguageModel {
|
|
|
247
378
|
}
|
|
248
379
|
async doGenerate(options) {
|
|
249
380
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
|
|
250
|
-
const { args: body, warnings } = this.getArgs(options);
|
|
381
|
+
const { args: body, warnings } = await this.getArgs(options);
|
|
251
382
|
const {
|
|
252
383
|
responseHeaders,
|
|
253
384
|
value: response,
|
|
@@ -320,7 +451,7 @@ var PerplexityLanguageModel = class _PerplexityLanguageModel {
|
|
|
320
451
|
}
|
|
321
452
|
async doStream(options) {
|
|
322
453
|
var _a, _b;
|
|
323
|
-
const { args, warnings } = this.getArgs(options);
|
|
454
|
+
const { args, warnings } = await this.getArgs(options);
|
|
324
455
|
const body = { ...args, stream: true };
|
|
325
456
|
const { responseHeaders, value: response } = await postJsonToApi({
|
|
326
457
|
url: `${this.config.baseURL}/chat/completions`,
|
|
@@ -459,66 +590,66 @@ function getResponseMetadata({
|
|
|
459
590
|
timestamp: new Date(created * 1e3)
|
|
460
591
|
};
|
|
461
592
|
}
|
|
462
|
-
var perplexityCostSchema =
|
|
463
|
-
input_tokens_cost:
|
|
464
|
-
output_tokens_cost:
|
|
465
|
-
request_cost:
|
|
466
|
-
total_cost:
|
|
593
|
+
var perplexityCostSchema = z2.object({
|
|
594
|
+
input_tokens_cost: z2.number().nullish(),
|
|
595
|
+
output_tokens_cost: z2.number().nullish(),
|
|
596
|
+
request_cost: z2.number().nullish(),
|
|
597
|
+
total_cost: z2.number().nullish()
|
|
467
598
|
});
|
|
468
|
-
var perplexityUsageSchema =
|
|
469
|
-
prompt_tokens:
|
|
470
|
-
completion_tokens:
|
|
471
|
-
total_tokens:
|
|
472
|
-
citation_tokens:
|
|
473
|
-
num_search_queries:
|
|
474
|
-
reasoning_tokens:
|
|
599
|
+
var perplexityUsageSchema = z2.object({
|
|
600
|
+
prompt_tokens: z2.number(),
|
|
601
|
+
completion_tokens: z2.number(),
|
|
602
|
+
total_tokens: z2.number().nullish(),
|
|
603
|
+
citation_tokens: z2.number().nullish(),
|
|
604
|
+
num_search_queries: z2.number().nullish(),
|
|
605
|
+
reasoning_tokens: z2.number().nullish(),
|
|
475
606
|
cost: perplexityCostSchema.nullish()
|
|
476
607
|
});
|
|
477
|
-
var perplexityImageSchema =
|
|
478
|
-
image_url:
|
|
479
|
-
origin_url:
|
|
480
|
-
height:
|
|
481
|
-
width:
|
|
608
|
+
var perplexityImageSchema = z2.object({
|
|
609
|
+
image_url: z2.string(),
|
|
610
|
+
origin_url: z2.string(),
|
|
611
|
+
height: z2.number(),
|
|
612
|
+
width: z2.number()
|
|
482
613
|
});
|
|
483
|
-
var perplexityResponseSchema =
|
|
484
|
-
id:
|
|
485
|
-
created:
|
|
486
|
-
model:
|
|
487
|
-
choices:
|
|
488
|
-
|
|
489
|
-
message:
|
|
490
|
-
role:
|
|
491
|
-
content:
|
|
614
|
+
var perplexityResponseSchema = z2.object({
|
|
615
|
+
id: z2.string(),
|
|
616
|
+
created: z2.number(),
|
|
617
|
+
model: z2.string(),
|
|
618
|
+
choices: z2.array(
|
|
619
|
+
z2.object({
|
|
620
|
+
message: z2.object({
|
|
621
|
+
role: z2.literal("assistant"),
|
|
622
|
+
content: z2.string()
|
|
492
623
|
}),
|
|
493
|
-
finish_reason:
|
|
624
|
+
finish_reason: z2.string().nullish()
|
|
494
625
|
})
|
|
495
626
|
),
|
|
496
|
-
citations:
|
|
497
|
-
images:
|
|
627
|
+
citations: z2.array(z2.string()).nullish(),
|
|
628
|
+
images: z2.array(perplexityImageSchema).nullish(),
|
|
498
629
|
usage: perplexityUsageSchema.nullish()
|
|
499
630
|
});
|
|
500
|
-
var perplexityChunkSchema =
|
|
501
|
-
id:
|
|
502
|
-
created:
|
|
503
|
-
model:
|
|
504
|
-
choices:
|
|
505
|
-
|
|
506
|
-
delta:
|
|
507
|
-
role:
|
|
508
|
-
content:
|
|
631
|
+
var perplexityChunkSchema = z2.object({
|
|
632
|
+
id: z2.string(),
|
|
633
|
+
created: z2.number(),
|
|
634
|
+
model: z2.string(),
|
|
635
|
+
choices: z2.array(
|
|
636
|
+
z2.object({
|
|
637
|
+
delta: z2.object({
|
|
638
|
+
role: z2.literal("assistant").optional(),
|
|
639
|
+
content: z2.string().nullish()
|
|
509
640
|
}),
|
|
510
|
-
finish_reason:
|
|
641
|
+
finish_reason: z2.string().nullish()
|
|
511
642
|
})
|
|
512
643
|
),
|
|
513
|
-
citations:
|
|
514
|
-
images:
|
|
644
|
+
citations: z2.array(z2.string()).nullish(),
|
|
645
|
+
images: z2.array(perplexityImageSchema).nullish(),
|
|
515
646
|
usage: perplexityUsageSchema.nullish()
|
|
516
647
|
});
|
|
517
|
-
var perplexityErrorSchema =
|
|
518
|
-
error:
|
|
519
|
-
code:
|
|
520
|
-
message:
|
|
521
|
-
type:
|
|
648
|
+
var perplexityErrorSchema = z2.object({
|
|
649
|
+
error: z2.object({
|
|
650
|
+
code: z2.number(),
|
|
651
|
+
message: z2.string().nullish(),
|
|
652
|
+
type: z2.string().nullish()
|
|
522
653
|
})
|
|
523
654
|
});
|
|
524
655
|
var errorToMessage = (data) => {
|
|
@@ -527,7 +658,7 @@ var errorToMessage = (data) => {
|
|
|
527
658
|
};
|
|
528
659
|
|
|
529
660
|
// src/version.ts
|
|
530
|
-
var VERSION = true ? "4.0.
|
|
661
|
+
var VERSION = true ? "4.0.8" : "0.0.0-test";
|
|
531
662
|
|
|
532
663
|
// src/perplexity-provider.ts
|
|
533
664
|
function createPerplexity(options = {}) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/perplexity-provider.ts","../src/perplexity-language-model.ts","../src/convert-perplexity-usage.ts","../src/convert-to-perplexity-messages.ts","../src/map-perplexity-finish-reason.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { PerplexityLanguageModel } from './perplexity-language-model';\nimport type { PerplexityLanguageModelId } from './perplexity-options';\nimport { VERSION } from './version';\n\nexport interface PerplexityProvider extends ProviderV4 {\n /**\n * Creates an Perplexity chat model for text generation.\n */\n (modelId: PerplexityLanguageModelId): LanguageModelV4;\n\n /**\n * Creates an Perplexity language model for text generation.\n */\n languageModel(modelId: PerplexityLanguageModelId): LanguageModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface PerplexityProviderSettings {\n /**\n * Base URL for the perplexity API calls.\n */\n baseURL?: string;\n\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport function createPerplexity(\n options: PerplexityProviderSettings = {},\n): PerplexityProvider {\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PERPLEXITY_API_KEY',\n description: 'Perplexity',\n })}`,\n ...options.headers,\n },\n `ai-sdk/perplexity/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: PerplexityLanguageModelId) => {\n return new PerplexityLanguageModel(modelId, {\n baseURL: withoutTrailingSlash(\n options.baseURL ?? 'https://api.perplexity.ai',\n )!,\n headers: getHeaders,\n generateId,\n fetch: options.fetch,\n });\n };\n\n const provider = (modelId: PerplexityLanguageModelId) =>\n createLanguageModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const perplexity = createPerplexity();\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n isCustomReasoning,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { convertPerplexityUsage } from './convert-perplexity-usage';\nimport { convertToPerplexityMessages } from './convert-to-perplexity-messages';\nimport { mapPerplexityFinishReason } from './map-perplexity-finish-reason';\nimport type { PerplexityLanguageModelId } from './perplexity-options';\n\ntype PerplexityChatConfig = {\n baseURL: string;\n headers?: () => Record<string, string | undefined>;\n generateId: () => string;\n fetch?: FetchFunction;\n};\n\nexport class PerplexityLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n readonly provider = 'perplexity';\n\n readonly modelId: PerplexityLanguageModelId;\n\n private readonly config: PerplexityChatConfig;\n\n static [WORKFLOW_SERIALIZE](model: PerplexityLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: PerplexityLanguageModelId;\n config: PerplexityChatConfig;\n }) {\n return new PerplexityLanguageModel(options.modelId, options.config);\n }\n\n constructor(\n modelId: PerplexityLanguageModelId,\n config: PerplexityChatConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {\n // No URLs are supported.\n };\n\n private getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n reasoning,\n responseFormat,\n seed,\n providerOptions,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (stopSequences != null) {\n warnings.push({ type: 'unsupported', feature: 'stopSequences' });\n }\n\n if (seed != null) {\n warnings.push({ type: 'unsupported', feature: 'seed' });\n }\n\n if (isCustomReasoning(reasoning)) {\n warnings.push({\n type: 'unsupported',\n feature: 'reasoning',\n details: 'This provider does not support reasoning configuration.',\n });\n }\n\n return {\n args: {\n // model id:\n model: this.modelId,\n\n // standardized settings:\n frequency_penalty: frequencyPenalty,\n max_tokens: maxOutputTokens,\n presence_penalty: presencePenalty,\n temperature,\n top_k: topK,\n top_p: topP,\n\n // response format:\n response_format:\n responseFormat?.type === 'json'\n ? {\n type: 'json_schema',\n json_schema: { schema: responseFormat.schema },\n }\n : undefined,\n\n // provider extensions\n ...(providerOptions?.perplexity ?? {}),\n\n // messages:\n messages: convertToPerplexityMessages(prompt),\n },\n warnings,\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args: body, warnings } = this.getArgs(options);\n\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: perplexityErrorSchema,\n errorToMessage,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n perplexityResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = response.choices[0];\n const content: Array<LanguageModelV4Content> = [];\n\n // text content:\n const text = choice.message.content;\n if (text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n // sources:\n if (response.citations != null) {\n for (const url of response.citations) {\n content.push({\n type: 'source',\n sourceType: 'url',\n id: this.config.generateId(),\n url,\n });\n }\n }\n\n return {\n content,\n finishReason: {\n unified: mapPerplexityFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: convertPerplexityUsage(response.usage),\n request: { body },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n providerMetadata: {\n perplexity: {\n images:\n response.images?.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n })) ?? null,\n usage: {\n citationTokens: response.usage?.citation_tokens ?? null,\n numSearchQueries: response.usage?.num_search_queries ?? null,\n },\n cost: response.usage?.cost\n ? {\n inputTokensCost: response.usage.cost.input_tokens_cost ?? null,\n outputTokensCost:\n response.usage.cost.output_tokens_cost ?? null,\n requestCost: response.usage.cost.request_cost ?? null,\n totalCost: response.usage.cost.total_cost ?? null,\n }\n : null,\n },\n },\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings } = this.getArgs(options);\n\n const body = { ...args, stream: true };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: perplexityErrorSchema,\n errorToMessage,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(\n perplexityChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage:\n | {\n prompt_tokens: number | undefined;\n completion_tokens: number | undefined;\n reasoning_tokens?: number | null | undefined;\n }\n | undefined = undefined;\n\n const providerMetadata: {\n perplexity: {\n usage: {\n citationTokens: number | null;\n numSearchQueries: number | null;\n };\n cost: {\n inputTokensCost: number | null;\n outputTokensCost: number | null;\n requestCost: number | null;\n totalCost: number | null;\n } | null;\n images: Array<{\n imageUrl: string;\n originUrl: string;\n height: number;\n width: number;\n }> | null;\n };\n } = {\n perplexity: {\n usage: {\n citationTokens: null,\n numSearchQueries: null,\n },\n cost: null,\n images: null,\n },\n };\n let isFirstChunk = true;\n let isActive = false;\n\n const self = this;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof perplexityChunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n // Emit raw chunk if requested (before anything else)\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n if (isFirstChunk) {\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value),\n });\n\n value.citations?.forEach(url => {\n controller.enqueue({\n type: 'source',\n sourceType: 'url',\n id: self.config.generateId(),\n url,\n });\n });\n\n isFirstChunk = false;\n }\n\n if (value.usage != null) {\n usage = value.usage;\n\n providerMetadata.perplexity.usage = {\n citationTokens: value.usage.citation_tokens ?? null,\n numSearchQueries: value.usage.num_search_queries ?? null,\n };\n\n providerMetadata.perplexity.cost = value.usage.cost\n ? {\n inputTokensCost: value.usage.cost.input_tokens_cost ?? null,\n outputTokensCost:\n value.usage.cost.output_tokens_cost ?? null,\n requestCost: value.usage.cost.request_cost ?? null,\n totalCost: value.usage.cost.total_cost ?? null,\n }\n : null;\n }\n\n if (value.images != null) {\n providerMetadata.perplexity.images = value.images.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n }));\n }\n\n const choice = value.choices[0];\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapPerplexityFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n };\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n const textContent = delta.content;\n\n if (textContent != null) {\n if (!isActive) {\n controller.enqueue({ type: 'text-start', id: '0' });\n isActive = true;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: '0',\n delta: textContent,\n });\n }\n },\n\n flush(controller) {\n if (isActive) {\n controller.enqueue({ type: 'text-end', id: '0' });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertPerplexityUsage(usage),\n providerMetadata,\n });\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\nfunction getResponseMetadata({\n id,\n model,\n created,\n}: {\n id: string;\n created: number;\n model: string;\n}) {\n return {\n id,\n modelId: model,\n timestamp: new Date(created * 1000),\n };\n}\n\nconst perplexityCostSchema = z.object({\n input_tokens_cost: z.number().nullish(),\n output_tokens_cost: z.number().nullish(),\n request_cost: z.number().nullish(),\n total_cost: z.number().nullish(),\n});\n\nconst perplexityUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number().nullish(),\n citation_tokens: z.number().nullish(),\n num_search_queries: z.number().nullish(),\n reasoning_tokens: z.number().nullish(),\n cost: perplexityCostSchema.nullish(),\n});\n\nexport const perplexityImageSchema = z.object({\n image_url: z.string(),\n origin_url: z.string(),\n height: z.number(),\n width: z.number(),\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst perplexityResponseSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant'),\n content: z.string(),\n }),\n finish_reason: z.string().nullish(),\n }),\n ),\n citations: z.array(z.string()).nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst perplexityChunkSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n choices: z.array(\n z.object({\n delta: z.object({\n role: z.literal('assistant').optional(),\n content: z.string().nullish(),\n }),\n finish_reason: z.string().nullish(),\n }),\n ),\n citations: z.array(z.string()).nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n\nexport const perplexityErrorSchema = z.object({\n error: z.object({\n code: z.number(),\n message: z.string().nullish(),\n type: z.string().nullish(),\n }),\n});\n\nexport type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;\n\nconst errorToMessage = (data: PerplexityErrorData) => {\n return data.error.message ?? data.error.type ?? 'unknown error';\n};\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\n\nexport function convertPerplexityUsage(\n usage:\n | {\n prompt_tokens?: number | null | undefined;\n completion_tokens?: number | null | undefined;\n reasoning_tokens?: number | null | undefined;\n }\n | undefined\n | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const reasoningTokens = usage.reasoning_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport type {\n PerplexityMessageContent,\n PerplexityPrompt,\n} from './perplexity-language-model-prompt';\nimport {\n convertUint8ArrayToBase64,\n getTopLevelMediaType,\n resolveFullMediaType,\n} from '@ai-sdk/provider-utils';\n\nexport function convertToPerplexityMessages(\n prompt: LanguageModelV4Prompt,\n): PerplexityPrompt {\n const messages: PerplexityPrompt = [];\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n messages.push({ role: 'system', content });\n break;\n }\n\n case 'user':\n case 'assistant': {\n const hasMultipartContent = content.some(\n part =>\n (part.type === 'file' &&\n getTopLevelMediaType(part.mediaType) === 'image') ||\n (part.type === 'file' &&\n getTopLevelMediaType(part.mediaType) === 'application'),\n );\n\n const messageContent = content\n .map((part, index) => {\n switch (part.type) {\n case 'text': {\n return {\n type: 'text',\n text: part.text,\n };\n }\n case 'file': {\n switch (part.data.type) {\n case 'reference': {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n case 'text': {\n throw new UnsupportedFunctionalityError({\n functionality: 'text file parts',\n });\n }\n case 'url':\n case 'data': {\n if (part.mediaType === 'application/pdf') {\n return part.data.type === 'url'\n ? {\n type: 'file_url',\n file_url: {\n url: part.data.url.toString(),\n },\n file_name: part.filename,\n }\n : {\n type: 'file_url',\n file_url: {\n url:\n typeof part.data.data === 'string'\n ? part.data.data\n : convertUint8ArrayToBase64(part.data.data),\n },\n file_name: part.filename || `document-${index}.pdf`,\n };\n } else if (\n getTopLevelMediaType(part.mediaType) === 'image'\n ) {\n return part.data.type === 'url'\n ? {\n type: 'image_url',\n image_url: {\n url: part.data.url.toString(),\n },\n }\n : {\n type: 'image_url',\n image_url: {\n url: `data:${resolveFullMediaType({ part })};base64,${\n typeof part.data.data === 'string'\n ? part.data.data\n : convertUint8ArrayToBase64(part.data.data)\n }`,\n },\n };\n }\n return undefined;\n }\n }\n }\n }\n })\n .filter(Boolean) as PerplexityMessageContent[];\n messages.push({\n role,\n content: hasMultipartContent\n ? messageContent\n : messageContent\n .filter(part => part.type === 'text')\n .map(part => part.text)\n .join(''),\n });\n break;\n }\n case 'tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Tool messages',\n });\n }\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapPerplexityFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n case 'length':\n return finishReason;\n default:\n return 'other';\n }\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../src/perplexity-provider.ts","../src/perplexity-language-model.ts","../src/convert-perplexity-usage.ts","../src/convert-to-perplexity-messages.ts","../src/map-perplexity-finish-reason.ts","../src/perplexity-language-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { PerplexityLanguageModel } from './perplexity-language-model';\nimport type { PerplexityLanguageModelId } from './perplexity-options';\nimport { VERSION } from './version';\n\nexport interface PerplexityProvider extends ProviderV4 {\n /**\n * Creates an Perplexity chat model for text generation.\n */\n (modelId: PerplexityLanguageModelId): LanguageModelV4;\n\n /**\n * Creates an Perplexity language model for text generation.\n */\n languageModel(modelId: PerplexityLanguageModelId): LanguageModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface PerplexityProviderSettings {\n /**\n * Base URL for the perplexity API calls.\n */\n baseURL?: string;\n\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport function createPerplexity(\n options: PerplexityProviderSettings = {},\n): PerplexityProvider {\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PERPLEXITY_API_KEY',\n description: 'Perplexity',\n })}`,\n ...options.headers,\n },\n `ai-sdk/perplexity/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: PerplexityLanguageModelId) => {\n return new PerplexityLanguageModel(modelId, {\n baseURL: withoutTrailingSlash(\n options.baseURL ?? 'https://api.perplexity.ai',\n )!,\n headers: getHeaders,\n generateId,\n fetch: options.fetch,\n });\n };\n\n const provider = (modelId: PerplexityLanguageModelId) =>\n createLanguageModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const perplexity = createPerplexity();\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n isCustomReasoning,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { convertPerplexityUsage } from './convert-perplexity-usage';\nimport { convertToPerplexityMessages } from './convert-to-perplexity-messages';\nimport { mapPerplexityFinishReason } from './map-perplexity-finish-reason';\nimport { perplexityLanguageModelOptions } from './perplexity-language-model-options';\nimport type { PerplexityLanguageModelId } from './perplexity-options';\n\ntype PerplexityChatConfig = {\n baseURL: string;\n headers?: () => Record<string, string | undefined>;\n generateId: () => string;\n fetch?: FetchFunction;\n};\n\nexport class PerplexityLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n readonly provider = 'perplexity';\n\n readonly modelId: PerplexityLanguageModelId;\n\n private readonly config: PerplexityChatConfig;\n\n static [WORKFLOW_SERIALIZE](model: PerplexityLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: PerplexityLanguageModelId;\n config: PerplexityChatConfig;\n }) {\n return new PerplexityLanguageModel(options.modelId, options.config);\n }\n\n constructor(\n modelId: PerplexityLanguageModelId,\n config: PerplexityChatConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {\n // No URLs are supported.\n };\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n reasoning,\n responseFormat,\n seed,\n providerOptions,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n const perplexityOptions =\n (await parseProviderOptions({\n provider: 'perplexity',\n providerOptions,\n schema: perplexityLanguageModelOptions,\n })) ?? {};\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (stopSequences != null) {\n warnings.push({ type: 'unsupported', feature: 'stopSequences' });\n }\n\n if (seed != null) {\n warnings.push({ type: 'unsupported', feature: 'seed' });\n }\n\n if (isCustomReasoning(reasoning)) {\n warnings.push({\n type: 'unsupported',\n feature: 'reasoning',\n details: 'This provider does not support reasoning configuration.',\n });\n }\n\n return {\n args: {\n // model id:\n model: this.modelId,\n\n // standardized settings:\n frequency_penalty: frequencyPenalty,\n max_tokens: maxOutputTokens,\n presence_penalty: presencePenalty,\n temperature,\n top_k: topK,\n top_p: topP,\n\n // response format:\n response_format:\n responseFormat?.type === 'json'\n ? {\n type: 'json_schema',\n json_schema: { schema: responseFormat.schema },\n }\n : undefined,\n\n // provider extensions\n ...perplexityOptions,\n\n // messages:\n messages: convertToPerplexityMessages(prompt),\n },\n warnings,\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args: body, warnings } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: perplexityErrorSchema,\n errorToMessage,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n perplexityResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = response.choices[0];\n const content: Array<LanguageModelV4Content> = [];\n\n // text content:\n const text = choice.message.content;\n if (text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n // sources:\n if (response.citations != null) {\n for (const url of response.citations) {\n content.push({\n type: 'source',\n sourceType: 'url',\n id: this.config.generateId(),\n url,\n });\n }\n }\n\n return {\n content,\n finishReason: {\n unified: mapPerplexityFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: convertPerplexityUsage(response.usage),\n request: { body },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n providerMetadata: {\n perplexity: {\n images:\n response.images?.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n })) ?? null,\n usage: {\n citationTokens: response.usage?.citation_tokens ?? null,\n numSearchQueries: response.usage?.num_search_queries ?? null,\n },\n cost: response.usage?.cost\n ? {\n inputTokensCost: response.usage.cost.input_tokens_cost ?? null,\n outputTokensCost:\n response.usage.cost.output_tokens_cost ?? null,\n requestCost: response.usage.cost.request_cost ?? null,\n totalCost: response.usage.cost.total_cost ?? null,\n }\n : null,\n },\n },\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings } = await this.getArgs(options);\n\n const body = { ...args, stream: true };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: perplexityErrorSchema,\n errorToMessage,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(\n perplexityChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage:\n | {\n prompt_tokens: number | undefined;\n completion_tokens: number | undefined;\n reasoning_tokens?: number | null | undefined;\n }\n | undefined = undefined;\n\n const providerMetadata: {\n perplexity: {\n usage: {\n citationTokens: number | null;\n numSearchQueries: number | null;\n };\n cost: {\n inputTokensCost: number | null;\n outputTokensCost: number | null;\n requestCost: number | null;\n totalCost: number | null;\n } | null;\n images: Array<{\n imageUrl: string;\n originUrl: string;\n height: number;\n width: number;\n }> | null;\n };\n } = {\n perplexity: {\n usage: {\n citationTokens: null,\n numSearchQueries: null,\n },\n cost: null,\n images: null,\n },\n };\n let isFirstChunk = true;\n let isActive = false;\n\n const self = this;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof perplexityChunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n // Emit raw chunk if requested (before anything else)\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n if (isFirstChunk) {\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value),\n });\n\n value.citations?.forEach(url => {\n controller.enqueue({\n type: 'source',\n sourceType: 'url',\n id: self.config.generateId(),\n url,\n });\n });\n\n isFirstChunk = false;\n }\n\n if (value.usage != null) {\n usage = value.usage;\n\n providerMetadata.perplexity.usage = {\n citationTokens: value.usage.citation_tokens ?? null,\n numSearchQueries: value.usage.num_search_queries ?? null,\n };\n\n providerMetadata.perplexity.cost = value.usage.cost\n ? {\n inputTokensCost: value.usage.cost.input_tokens_cost ?? null,\n outputTokensCost:\n value.usage.cost.output_tokens_cost ?? null,\n requestCost: value.usage.cost.request_cost ?? null,\n totalCost: value.usage.cost.total_cost ?? null,\n }\n : null;\n }\n\n if (value.images != null) {\n providerMetadata.perplexity.images = value.images.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n }));\n }\n\n const choice = value.choices[0];\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapPerplexityFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n };\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n const textContent = delta.content;\n\n if (textContent != null) {\n if (!isActive) {\n controller.enqueue({ type: 'text-start', id: '0' });\n isActive = true;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: '0',\n delta: textContent,\n });\n }\n },\n\n flush(controller) {\n if (isActive) {\n controller.enqueue({ type: 'text-end', id: '0' });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertPerplexityUsage(usage),\n providerMetadata,\n });\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n\nfunction getResponseMetadata({\n id,\n model,\n created,\n}: {\n id: string;\n created: number;\n model: string;\n}) {\n return {\n id,\n modelId: model,\n timestamp: new Date(created * 1000),\n };\n}\n\nconst perplexityCostSchema = z.object({\n input_tokens_cost: z.number().nullish(),\n output_tokens_cost: z.number().nullish(),\n request_cost: z.number().nullish(),\n total_cost: z.number().nullish(),\n});\n\nconst perplexityUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number().nullish(),\n citation_tokens: z.number().nullish(),\n num_search_queries: z.number().nullish(),\n reasoning_tokens: z.number().nullish(),\n cost: perplexityCostSchema.nullish(),\n});\n\nexport const perplexityImageSchema = z.object({\n image_url: z.string(),\n origin_url: z.string(),\n height: z.number(),\n width: z.number(),\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst perplexityResponseSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant'),\n content: z.string(),\n }),\n finish_reason: z.string().nullish(),\n }),\n ),\n citations: z.array(z.string()).nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst perplexityChunkSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n choices: z.array(\n z.object({\n delta: z.object({\n role: z.literal('assistant').optional(),\n content: z.string().nullish(),\n }),\n finish_reason: z.string().nullish(),\n }),\n ),\n citations: z.array(z.string()).nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n\nexport const perplexityErrorSchema = z.object({\n error: z.object({\n code: z.number(),\n message: z.string().nullish(),\n type: z.string().nullish(),\n }),\n});\n\nexport type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;\n\nconst errorToMessage = (data: PerplexityErrorData) => {\n return data.error.message ?? data.error.type ?? 'unknown error';\n};\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\n\nexport function convertPerplexityUsage(\n usage:\n | {\n prompt_tokens?: number | null | undefined;\n completion_tokens?: number | null | undefined;\n reasoning_tokens?: number | null | undefined;\n }\n | undefined\n | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const reasoningTokens = usage.reasoning_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport type {\n PerplexityMessageContent,\n PerplexityPrompt,\n} from './perplexity-language-model-prompt';\nimport {\n convertUint8ArrayToBase64,\n getTopLevelMediaType,\n resolveFullMediaType,\n} from '@ai-sdk/provider-utils';\n\nexport function convertToPerplexityMessages(\n prompt: LanguageModelV4Prompt,\n): PerplexityPrompt {\n const messages: PerplexityPrompt = [];\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n messages.push({ role: 'system', content });\n break;\n }\n\n case 'user':\n case 'assistant': {\n const hasMultipartContent = content.some(\n part =>\n (part.type === 'file' &&\n getTopLevelMediaType(part.mediaType) === 'image') ||\n (part.type === 'file' &&\n getTopLevelMediaType(part.mediaType) === 'application'),\n );\n\n const messageContent = content\n .map((part, index) => {\n switch (part.type) {\n case 'text': {\n return {\n type: 'text',\n text: part.text,\n };\n }\n case 'file': {\n switch (part.data.type) {\n case 'reference': {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n case 'text': {\n throw new UnsupportedFunctionalityError({\n functionality: 'text file parts',\n });\n }\n case 'url':\n case 'data': {\n const topLevelMediaType = getTopLevelMediaType(\n part.mediaType,\n );\n\n if (topLevelMediaType === 'application') {\n const fullMediaType = resolveFullMediaType({ part });\n\n if (fullMediaType !== 'application/pdf') {\n throw new UnsupportedFunctionalityError({\n functionality: `file part media type ${fullMediaType}`,\n });\n }\n\n return part.data.type === 'url'\n ? {\n type: 'file_url',\n file_url: {\n url: part.data.url.toString(),\n },\n file_name: part.filename,\n }\n : {\n type: 'file_url',\n file_url: {\n url:\n typeof part.data.data === 'string'\n ? part.data.data\n : convertUint8ArrayToBase64(part.data.data),\n },\n file_name: part.filename || `document-${index}.pdf`,\n };\n } else if (topLevelMediaType === 'image') {\n return part.data.type === 'url'\n ? {\n type: 'image_url',\n image_url: {\n url: part.data.url.toString(),\n },\n }\n : {\n type: 'image_url',\n image_url: {\n url: `data:${resolveFullMediaType({ part })};base64,${\n typeof part.data.data === 'string'\n ? part.data.data\n : convertUint8ArrayToBase64(part.data.data)\n }`,\n },\n };\n }\n throw new UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`,\n });\n }\n }\n }\n }\n })\n .filter(Boolean) as PerplexityMessageContent[];\n messages.push({\n role,\n content: hasMultipartContent\n ? messageContent\n : messageContent\n .filter(part => part.type === 'text')\n .map(part => part.text)\n .join(''),\n });\n break;\n }\n case 'tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Tool messages',\n });\n }\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapPerplexityFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n case 'length':\n return finishReason;\n default:\n return 'other';\n }\n}\n","import { z } from 'zod/v4';\n\nexport const perplexityLanguageModelOptions = z.looseObject({\n /**\n * Filters search results to those published within the specified time window.\n * Cannot be combined with other date filters.\n */\n search_recency_filter: z\n .enum(['hour', 'day', 'week', 'month', 'year'])\n .optional(),\n\n /**\n * Restrict web search results to specific domains or URLs.\n * Prefix a domain with \"-\" to exclude it.\n */\n search_domain_filter: z.array(z.string()).optional(),\n\n /**\n * Filter search results by language using ISO 639-1 codes.\n */\n search_language_filter: z.array(z.string()).optional(),\n\n /**\n * Return search results published after this date.\n */\n search_after_date_filter: z.string().optional(),\n\n /**\n * Return search results published before this date.\n */\n search_before_date_filter: z.string().optional(),\n\n /**\n * Return search results last updated after this date.\n */\n last_updated_after_filter: z.string().optional(),\n\n /**\n * Return search results last updated before this date.\n */\n last_updated_before_filter: z.string().optional(),\n\n /**\n * Source of search results.\n */\n search_mode: z.enum(['web', 'academic', 'sec']).optional(),\n\n /**\n * If true, the model decides whether web search is needed.\n */\n enable_search_classifier: z.boolean().optional(),\n\n /**\n * If true, disables web search.\n */\n disable_search: z.boolean().optional(),\n\n /**\n * If true, a list of related questions is included in the response.\n */\n return_related_questions: z.boolean().optional(),\n\n /**\n * If true, image search results are included in the response.\n */\n return_images: z.boolean().optional(),\n\n /**\n * Restrict image results to specific domains.\n * Prefix a domain with \"-\" to exclude it.\n */\n image_domain_filter: z.array(z.string()).optional(),\n\n /**\n * Restrict image results to specific file formats.\n */\n image_format_filter: z.array(z.string()).optional(),\n\n /**\n * Additional media response configuration.\n */\n media_response: z\n .looseObject({\n overrides: z\n .looseObject({\n /**\n * If true, video results are included in the response.\n */\n return_videos: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n\n /**\n * Controls the format of streaming events.\n */\n stream_mode: z.enum(['full', 'concise']).optional(),\n\n /**\n * Controls how much effort the model spends on reasoning.\n */\n reasoning_effort: z.enum(['minimal', 'low', 'medium', 'high']).optional(),\n\n /**\n * Preferred response language as an ISO 639-1 language code.\n */\n language_preference: z.string().optional(),\n\n /**\n * Additional web search configuration.\n */\n web_search_options: z\n .looseObject({\n /**\n * Controls the size of search context injected into the model.\n */\n search_context_size: z.enum(['low', 'medium', 'high']).optional(),\n\n /**\n * Controls whether to use fast search, pro search, or automatic routing.\n */\n search_type: z.enum(['fast', 'pro', 'auto']).optional(),\n\n /**\n * User location for search result personalization.\n */\n user_location: z\n .looseObject({\n latitude: z.number().optional(),\n longitude: z.number().optional(),\n country: z.string().optional(),\n city: z.string().optional(),\n region: z.string().optional(),\n })\n .optional(),\n\n /**\n * If true, applies enhanced relevance filtering to image results.\n */\n image_results_enhanced_relevance: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type PerplexityLanguageModelOptions = z.infer<\n typeof perplexityLanguageModelOptions\n>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACDP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,KAAAA,UAAS;;;ACtBX,SAAS,uBACd,OAQsB;AAXxB;AAYE,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,MACL,aAAa;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW;AAAA,MACb;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,QAAM,gBAAe,WAAM,kBAAN,YAAuB;AAC5C,QAAM,oBAAmB,WAAM,sBAAN,YAA2B;AACpD,QAAM,mBAAkB,WAAM,qBAAN,YAA0B;AAElD,SAAO;AAAA,IACL,aAAa;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,MAAM,mBAAmB;AAAA,MACzB,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,EACP;AACF;;;AC/CA;AAAA,EACE;AAAA,OAEK;AAKP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,SAAS,4BACd,QACkB;AAClB,QAAM,WAA6B,CAAC;AAEpC,aAAW,EAAE,MAAM,QAAQ,KAAK,QAAQ;AACtC,YAAQ,MAAM;AAAA,MACZ,KAAK,UAAU;AACb,iBAAS,KAAK,EAAE,MAAM,UAAU,QAAQ,CAAC;AACzC;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,MACL,KAAK,aAAa;AAChB,cAAM,sBAAsB,QAAQ;AAAA,UAClC,UACG,KAAK,SAAS,UACb,qBAAqB,KAAK,SAAS,MAAM,WAC1C,KAAK,SAAS,UACb,qBAAqB,KAAK,SAAS,MAAM;AAAA,QAC/C;AAEA,cAAM,iBAAiB,QACpB,IAAI,CAAC,MAAM,UAAU;AACpB,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,QAAQ;AACX,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,MAAM,KAAK;AAAA,cACb;AAAA,YACF;AAAA,YACA,KAAK,QAAQ;AACX,sBAAQ,KAAK,KAAK,MAAM;AAAA,gBACtB,KAAK,aAAa;AAChB,wBAAM,IAAI,8BAA8B;AAAA,oBACtC,eAAe;AAAA,kBACjB,CAAC;AAAA,gBACH;AAAA,gBACA,KAAK,QAAQ;AACX,wBAAM,IAAI,8BAA8B;AAAA,oBACtC,eAAe;AAAA,kBACjB,CAAC;AAAA,gBACH;AAAA,gBACA,KAAK;AAAA,gBACL,KAAK,QAAQ;AACX,wBAAM,oBAAoB;AAAA,oBACxB,KAAK;AAAA,kBACP;AAEA,sBAAI,sBAAsB,eAAe;AACvC,0BAAM,gBAAgB,qBAAqB,EAAE,KAAK,CAAC;AAEnD,wBAAI,kBAAkB,mBAAmB;AACvC,4BAAM,IAAI,8BAA8B;AAAA,wBACtC,eAAe,wBAAwB,aAAa;AAAA,sBACtD,CAAC;AAAA,oBACH;AAEA,2BAAO,KAAK,KAAK,SAAS,QACtB;AAAA,sBACE,MAAM;AAAA,sBACN,UAAU;AAAA,wBACR,KAAK,KAAK,KAAK,IAAI,SAAS;AAAA,sBAC9B;AAAA,sBACA,WAAW,KAAK;AAAA,oBAClB,IACA;AAAA,sBACE,MAAM;AAAA,sBACN,UAAU;AAAA,wBACR,KACE,OAAO,KAAK,KAAK,SAAS,WACtB,KAAK,KAAK,OACV,0BAA0B,KAAK,KAAK,IAAI;AAAA,sBAChD;AAAA,sBACA,WAAW,KAAK,YAAY,YAAY,KAAK;AAAA,oBAC/C;AAAA,kBACN,WAAW,sBAAsB,SAAS;AACxC,2BAAO,KAAK,KAAK,SAAS,QACtB;AAAA,sBACE,MAAM;AAAA,sBACN,WAAW;AAAA,wBACT,KAAK,KAAK,KAAK,IAAI,SAAS;AAAA,sBAC9B;AAAA,oBACF,IACA;AAAA,sBACE,MAAM;AAAA,sBACN,WAAW;AAAA,wBACT,KAAK,QAAQ,qBAAqB,EAAE,KAAK,CAAC,CAAC,WACzC,OAAO,KAAK,KAAK,SAAS,WACtB,KAAK,KAAK,OACV,0BAA0B,KAAK,KAAK,IAAI,CAC9C;AAAA,sBACF;AAAA,oBACF;AAAA,kBACN;AACA,wBAAM,IAAI,8BAA8B;AAAA,oBACtC,eAAe,wBAAwB,KAAK,SAAS;AAAA,kBACvD,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC,EACA,OAAO,OAAO;AACjB,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,SAAS,sBACL,iBACA,eACG,OAAO,UAAQ,KAAK,SAAS,MAAM,EACnC,IAAI,UAAQ,KAAK,IAAI,EACrB,KAAK,EAAE;AAAA,QAChB,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,IAAI,8BAA8B;AAAA,UACtC,eAAe;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,MACA,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,MAAM,qBAAqB,gBAAgB,EAAE;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC5IO,SAAS,0BACd,cACwC;AACxC,UAAQ,cAAc;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACZA,SAAS,SAAS;AAEX,IAAM,iCAAiC,EAAE,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1D,uBAAuB,EACpB,KAAK,CAAC,QAAQ,OAAO,QAAQ,SAAS,MAAM,CAAC,EAC7C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,sBAAsB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKnD,wBAAwB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKrD,0BAA0B,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK9C,2BAA2B,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK/C,2BAA2B,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK/C,4BAA4B,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKhD,aAAa,EAAE,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKzD,0BAA0B,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK/C,gBAAgB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKrC,0BAA0B,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK/C,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKlD,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKlD,gBAAgB,EACb,YAAY;AAAA,IACX,WAAW,EACR,YAAY;AAAA;AAAA;AAAA;AAAA,MAIX,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,IACtC,CAAC,EACA,SAAS;AAAA,EACd,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA,EAKZ,aAAa,EAAE,KAAK,CAAC,QAAQ,SAAS,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKlD,kBAAkB,EAAE,KAAK,CAAC,WAAW,OAAO,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKxE,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKzC,oBAAoB,EACjB,YAAY;AAAA;AAAA;AAAA;AAAA,IAIX,qBAAqB,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,IAKhE,aAAa,EAAE,KAAK,CAAC,QAAQ,OAAO,MAAM,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,IAKtD,eAAe,EACZ,YAAY;AAAA,MACX,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA,IAKZ,kCAAkC,EAAE,QAAQ,EAAE,SAAS;AAAA,EACzD,CAAC,EACA,SAAS;AACd,CAAC;;;AJzGM,IAAM,0BAAN,MAAM,yBAAmD;AAAA,EAsB9D,YACE,SACA,QACA;AAxBF,SAAS,uBAAuB;AAChC,SAAS,WAAW;AA4BpB,SAAS,gBAA0C;AAAA;AAAA,IAEnD;AANE,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EApBA,QAAQ,kBAAkB,EAAE,OAAgC;AAC1D,WAAO,sBAAsB;AAAA,MAC3B,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,oBAAoB,EAAE,SAG3B;AACD,WAAO,IAAI,yBAAwB,QAAQ,SAAS,QAAQ,MAAM;AAAA,EACpE;AAAA,EAcA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA+B;AArFjC;AAsFI,UAAM,WAA8B,CAAC;AAErC,UAAM,qBACH,WAAM,qBAAqB;AAAA,MAC1B,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC,MAJA,YAIM,CAAC;AAEV,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK,EAAE,MAAM,eAAe,SAAS,OAAO,CAAC;AAAA,IACxD;AAEA,QAAI,iBAAiB,MAAM;AACzB,eAAS,KAAK,EAAE,MAAM,eAAe,SAAS,gBAAgB,CAAC;AAAA,IACjE;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK,EAAE,MAAM,eAAe,SAAS,OAAO,CAAC;AAAA,IACxD;AAEA,QAAI,kBAAkB,SAAS,GAAG;AAChC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,MAAM;AAAA;AAAA,QAEJ,OAAO,KAAK;AAAA;AAAA,QAGZ,mBAAmB;AAAA,QACnB,YAAY;AAAA,QACZ,kBAAkB;AAAA,QAClB;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA;AAAA,QAGP,kBACE,iDAAgB,UAAS,SACrB;AAAA,UACE,MAAM;AAAA,UACN,aAAa,EAAE,QAAQ,eAAe,OAAO;AAAA,QAC/C,IACA;AAAA;AAAA,QAGN,GAAG;AAAA;AAAA,QAGH,UAAU,4BAA4B,MAAM;AAAA,MAC9C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SACwC;AArJ5C;AAsJI,UAAM,EAAE,MAAM,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAE3D,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,IAAI,MAAM,cAAc;AAAA,MACtB,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,gBAAe,gBAAK,QAAO,YAAZ,6BAAyB,QAAQ,OAAO;AAAA,MAChE;AAAA,MACA,uBAAuB,+BAA+B;AAAA,QACpD,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AAAA,MACD,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,UAAM,UAAyC,CAAC;AAGhD,UAAM,OAAO,OAAO,QAAQ;AAC5B,QAAI,KAAK,SAAS,GAAG;AACnB,cAAQ,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IACrC;AAGA,QAAI,SAAS,aAAa,MAAM;AAC9B,iBAAW,OAAO,SAAS,WAAW;AACpC,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,IAAI,KAAK,OAAO,WAAW;AAAA,UAC3B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,QACZ,SAAS,0BAA0B,OAAO,aAAa;AAAA,QACvD,MAAK,YAAO,kBAAP,YAAwB;AAAA,MAC/B;AAAA,MACA,OAAO,uBAAuB,SAAS,KAAK;AAAA,MAC5C,SAAS,EAAE,KAAK;AAAA,MAChB,UAAU;AAAA,QACR,GAAG,oBAAoB,QAAQ;AAAA,QAC/B,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,QAChB,YAAY;AAAA,UACV,SACE,oBAAS,WAAT,mBAAiB,IAAI,YAAU;AAAA,YAC7B,UAAU,MAAM;AAAA,YAChB,WAAW,MAAM;AAAA,YACjB,QAAQ,MAAM;AAAA,YACd,OAAO,MAAM;AAAA,UACf,QALA,YAKO;AAAA,UACT,OAAO;AAAA,YACL,iBAAgB,oBAAS,UAAT,mBAAgB,oBAAhB,YAAmC;AAAA,YACnD,mBAAkB,oBAAS,UAAT,mBAAgB,uBAAhB,YAAsC;AAAA,UAC1D;AAAA,UACA,QAAM,cAAS,UAAT,mBAAgB,QAClB;AAAA,YACE,kBAAiB,cAAS,MAAM,KAAK,sBAApB,YAAyC;AAAA,YAC1D,mBACE,cAAS,MAAM,KAAK,uBAApB,YAA0C;AAAA,YAC5C,cAAa,cAAS,MAAM,KAAK,iBAApB,YAAoC;AAAA,YACjD,YAAW,cAAS,MAAM,KAAK,eAApB,YAAkC;AAAA,UAC/C,IACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SACsC;AA3O1C;AA4OI,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAErD,UAAM,OAAO,EAAE,GAAG,MAAM,QAAQ,KAAK;AAErC,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,MAAM,cAAc;AAAA,MAC/D,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,gBAAe,gBAAK,QAAO,YAAZ,6BAAyB,QAAQ,OAAO;AAAA,MAChE;AAAA,MACA,uBAAuB,+BAA+B;AAAA,QACpD,aAAa;AAAA,QACb;AAAA,MACF,CAAC;AAAA,MACD,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,QAAI,eAA4C;AAAA,MAC9C,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AACA,QAAI,QAMY;AAEhB,UAAM,mBAmBF;AAAA,MACF,YAAY;AAAA,QACV,OAAO;AAAA,UACL,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AACA,QAAI,eAAe;AACnB,QAAI,WAAW;AAEf,UAAM,OAAO;AAEb,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,QACf,IAAI,gBAGF;AAAA,UACA,MAAM,YAAY;AAChB,uBAAW,QAAQ,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAAA,UACvD;AAAA,UAEA,UAAU,OAAO,YAAY;AAvTvC,gBAAAC,KAAAC,KAAA;AAyTY,gBAAI,QAAQ,kBAAkB;AAC5B,yBAAW,QAAQ,EAAE,MAAM,OAAO,UAAU,MAAM,SAAS,CAAC;AAAA,YAC9D;AAEA,gBAAI,CAAC,MAAM,SAAS;AAClB,yBAAW,QAAQ,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM,CAAC;AACxD;AAAA,YACF;AAEA,kBAAM,QAAQ,MAAM;AAEpB,gBAAI,cAAc;AAChB,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,GAAG,oBAAoB,KAAK;AAAA,cAC9B,CAAC;AAED,eAAAD,MAAA,MAAM,cAAN,gBAAAA,IAAiB,QAAQ,SAAO;AAC9B,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,YAAY;AAAA,kBACZ,IAAI,KAAK,OAAO,WAAW;AAAA,kBAC3B;AAAA,gBACF,CAAC;AAAA,cACH;AAEA,6BAAe;AAAA,YACjB;AAEA,gBAAI,MAAM,SAAS,MAAM;AACvB,sBAAQ,MAAM;AAEd,+BAAiB,WAAW,QAAQ;AAAA,gBAClC,iBAAgBC,MAAA,MAAM,MAAM,oBAAZ,OAAAA,MAA+B;AAAA,gBAC/C,mBAAkB,WAAM,MAAM,uBAAZ,YAAkC;AAAA,cACtD;AAEA,+BAAiB,WAAW,OAAO,MAAM,MAAM,OAC3C;AAAA,gBACE,kBAAiB,WAAM,MAAM,KAAK,sBAAjB,YAAsC;AAAA,gBACvD,mBACE,WAAM,MAAM,KAAK,uBAAjB,YAAuC;AAAA,gBACzC,cAAa,WAAM,MAAM,KAAK,iBAAjB,YAAiC;AAAA,gBAC9C,YAAW,WAAM,MAAM,KAAK,eAAjB,YAA+B;AAAA,cAC5C,IACA;AAAA,YACN;AAEA,gBAAI,MAAM,UAAU,MAAM;AACxB,+BAAiB,WAAW,SAAS,MAAM,OAAO,IAAI,YAAU;AAAA,gBAC9D,UAAU,MAAM;AAAA,gBAChB,WAAW,MAAM;AAAA,gBACjB,QAAQ,MAAM;AAAA,gBACd,OAAO,MAAM;AAAA,cACf,EAAE;AAAA,YACJ;AAEA,kBAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,iBAAI,iCAAQ,kBAAiB,MAAM;AACjC,6BAAe;AAAA,gBACb,SAAS,0BAA0B,OAAO,aAAa;AAAA,gBACvD,KAAK,OAAO;AAAA,cACd;AAAA,YACF;AAEA,iBAAI,iCAAQ,UAAS,MAAM;AACzB;AAAA,YACF;AAEA,kBAAM,QAAQ,OAAO;AACrB,kBAAM,cAAc,MAAM;AAE1B,gBAAI,eAAe,MAAM;AACvB,kBAAI,CAAC,UAAU;AACb,2BAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,IAAI,CAAC;AAClD,2BAAW;AAAA,cACb;AAEA,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO;AAAA,cACT,CAAC;AAAA,YACH;AAAA,UACF;AAAA,UAEA,MAAM,YAAY;AAChB,gBAAI,UAAU;AACZ,yBAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,YAClD;AAEA,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA,OAAO,uBAAuB,KAAK;AAAA,cACnC;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,SAAS,EAAE,KAAK;AAAA,MAChB,UAAU,EAAE,SAAS,gBAAgB;AAAA,IACvC;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,WAAW,IAAI,KAAK,UAAU,GAAI;AAAA,EACpC;AACF;AAEA,IAAM,uBAAuBC,GAAE,OAAO;AAAA,EACpC,mBAAmBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACtC,oBAAoBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvC,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,YAAYA,GAAE,OAAO,EAAE,QAAQ;AACjC,CAAC;AAED,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,eAAeA,GAAE,OAAO;AAAA,EACxB,mBAAmBA,GAAE,OAAO;AAAA,EAC5B,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,iBAAiBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACpC,oBAAoBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvC,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACrC,MAAM,qBAAqB,QAAQ;AACrC,CAAC;AAEM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,WAAWA,GAAE,OAAO;AAAA,EACpB,YAAYA,GAAE,OAAO;AAAA,EACrB,QAAQA,GAAE,OAAO;AAAA,EACjB,OAAOA,GAAE,OAAO;AAClB,CAAC;AAID,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EACxC,IAAIA,GAAE,OAAO;AAAA,EACb,SAASA,GAAE,OAAO;AAAA,EAClB,OAAOA,GAAE,OAAO;AAAA,EAChB,SAASA,GAAE;AAAA,IACTA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO;AAAA,QAChB,MAAMA,GAAE,QAAQ,WAAW;AAAA,QAC3B,SAASA,GAAE,OAAO;AAAA,MACpB,CAAC;AAAA,MACD,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EACA,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,EACvC,QAAQA,GAAE,MAAM,qBAAqB,EAAE,QAAQ;AAAA,EAC/C,OAAO,sBAAsB,QAAQ;AACvC,CAAC;AAID,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,IAAIA,GAAE,OAAO;AAAA,EACb,SAASA,GAAE,OAAO;AAAA,EAClB,OAAOA,GAAE,OAAO;AAAA,EAChB,SAASA,GAAE;AAAA,IACTA,GAAE,OAAO;AAAA,MACP,OAAOA,GAAE,OAAO;AAAA,QACd,MAAMA,GAAE,QAAQ,WAAW,EAAE,SAAS;AAAA,QACtC,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC9B,CAAC;AAAA,MACD,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EACA,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,EACvC,QAAQA,GAAE,MAAM,qBAAqB,EAAE,QAAQ;AAAA,EAC/C,OAAO,sBAAsB,QAAQ;AACvC,CAAC;AAEM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EAC5C,OAAOA,GAAE,OAAO;AAAA,IACd,MAAMA,GAAE,OAAO;AAAA,IACf,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC3B,CAAC;AACH,CAAC;AAID,IAAM,iBAAiB,CAAC,SAA8B;AA7ftD;AA8fE,UAAO,gBAAK,MAAM,YAAX,YAAsB,KAAK,MAAM,SAAjC,YAAyC;AAClD;;;AK7fO,IAAM,UACX,OACI,UACA;;;ANmDC,SAAS,iBACd,UAAsC,CAAC,GACnB;AACpB,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,qBAAqB,OAAO;AAAA,EAC9B;AAEF,QAAM,sBAAsB,CAAC,YAAuC;AAxEtE;AAyEI,WAAO,IAAI,wBAAwB,SAAS;AAAA,MAC1C,SAAS;AAAA,SACP,aAAQ,YAAR,YAAmB;AAAA,MACrB;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,YAChB,oBAAoB,OAAO;AAE7B,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AAEzB,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AACA,WAAS,qBAAqB,SAAS;AACvC,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,IAAM,aAAa,iBAAiB;","names":["z","_a","_b","z"]}
|
package/docs/70-perplexity.mdx
CHANGED
|
@@ -13,21 +13,7 @@ API keys can be obtained from the [Perplexity Platform](https://docs.perplexity.
|
|
|
13
13
|
|
|
14
14
|
The Perplexity provider is available via the `@ai-sdk/perplexity` module. You can install it with:
|
|
15
15
|
|
|
16
|
-
<
|
|
17
|
-
<Tab>
|
|
18
|
-
<Snippet text="pnpm add @ai-sdk/perplexity" dark />
|
|
19
|
-
</Tab>
|
|
20
|
-
<Tab>
|
|
21
|
-
<Snippet text="npm install @ai-sdk/perplexity" dark />
|
|
22
|
-
</Tab>
|
|
23
|
-
<Tab>
|
|
24
|
-
<Snippet text="yarn add @ai-sdk/perplexity" dark />
|
|
25
|
-
</Tab>
|
|
26
|
-
|
|
27
|
-
<Tab>
|
|
28
|
-
<Snippet text="bun add @ai-sdk/perplexity" dark />
|
|
29
|
-
</Tab>
|
|
30
|
-
</Tabs>
|
|
16
|
+
<InstallPackages packages="@ai-sdk/perplexity" />
|
|
31
17
|
|
|
32
18
|
## Provider Instance
|
|
33
19
|
|
|
@@ -103,6 +89,12 @@ The Perplexity provider includes additional metadata in the response through `pr
|
|
|
103
89
|
Additional configuration options are available through `providerOptions`.
|
|
104
90
|
|
|
105
91
|
```ts
|
|
92
|
+
import {
|
|
93
|
+
perplexity,
|
|
94
|
+
type PerplexityLanguageModelOptions,
|
|
95
|
+
} from '@ai-sdk/perplexity';
|
|
96
|
+
import { generateText } from 'ai';
|
|
97
|
+
|
|
106
98
|
const result = await generateText({
|
|
107
99
|
model: perplexity('sonar-pro'),
|
|
108
100
|
prompt: 'What are the latest developments in quantum computing?',
|
|
@@ -110,7 +102,7 @@ const result = await generateText({
|
|
|
110
102
|
perplexity: {
|
|
111
103
|
return_images: true, // Enable image responses (Tier-2 Perplexity users only)
|
|
112
104
|
search_recency_filter: 'week', // Filter search results by recency
|
|
113
|
-
},
|
|
105
|
+
} satisfies PerplexityLanguageModelOptions,
|
|
114
106
|
},
|
|
115
107
|
});
|
|
116
108
|
|
|
@@ -137,7 +129,7 @@ The following provider-specific options are available:
|
|
|
137
129
|
|
|
138
130
|
- **search_recency_filter** _string_
|
|
139
131
|
|
|
140
|
-
Filter search results by recency. Possible values: `'hour'`, `'day'`, `'week'`, `'month'`. If not specified, defaults to all time.
|
|
132
|
+
Filter search results by recency. Possible values: `'hour'`, `'day'`, `'week'`, `'month'`, `'year'`. If not specified, defaults to all time.
|
|
141
133
|
|
|
142
134
|
<Note>
|
|
143
135
|
Any other [Perplexity API
|
|
@@ -201,13 +193,13 @@ respond to questions about it.
|
|
|
201
193
|
|
|
202
194
|
## Model Capabilities
|
|
203
195
|
|
|
204
|
-
| Model | Image Input
|
|
205
|
-
| --------------------- |
|
|
206
|
-
| `sonar-deep-research` | <Cross
|
|
207
|
-
| `sonar-reasoning-pro` | <Check
|
|
208
|
-
| `sonar-reasoning` | <Check
|
|
209
|
-
| `sonar-pro` | <Check
|
|
210
|
-
| `sonar` | <Check
|
|
196
|
+
| Model | Image Input | Object Generation | Tool Usage | Tool Streaming |
|
|
197
|
+
| --------------------- | ----------- | ----------------- | ---------- | -------------- |
|
|
198
|
+
| `sonar-deep-research` | <Cross /> | <Check /> | <Cross /> | <Cross /> |
|
|
199
|
+
| `sonar-reasoning-pro` | <Check /> | <Check /> | <Cross /> | <Cross /> |
|
|
200
|
+
| `sonar-reasoning` | <Check /> | <Check /> | <Cross /> | <Cross /> |
|
|
201
|
+
| `sonar-pro` | <Check /> | <Check /> | <Cross /> | <Cross /> |
|
|
202
|
+
| `sonar` | <Check /> | <Check /> | <Cross /> | <Cross /> |
|
|
211
203
|
|
|
212
204
|
<Note>
|
|
213
205
|
Please see the [Perplexity docs](https://docs.perplexity.ai) for detailed API
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/perplexity",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ai-sdk/provider": "4.0.
|
|
33
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
32
|
+
"@ai-sdk/provider": "4.0.3",
|
|
33
|
+
"@ai-sdk/provider-utils": "5.0.7"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "22.19.19",
|
|
@@ -57,7 +57,19 @@ export function convertToPerplexityMessages(
|
|
|
57
57
|
}
|
|
58
58
|
case 'url':
|
|
59
59
|
case 'data': {
|
|
60
|
-
|
|
60
|
+
const topLevelMediaType = getTopLevelMediaType(
|
|
61
|
+
part.mediaType,
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
if (topLevelMediaType === 'application') {
|
|
65
|
+
const fullMediaType = resolveFullMediaType({ part });
|
|
66
|
+
|
|
67
|
+
if (fullMediaType !== 'application/pdf') {
|
|
68
|
+
throw new UnsupportedFunctionalityError({
|
|
69
|
+
functionality: `file part media type ${fullMediaType}`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
61
73
|
return part.data.type === 'url'
|
|
62
74
|
? {
|
|
63
75
|
type: 'file_url',
|
|
@@ -76,9 +88,7 @@ export function convertToPerplexityMessages(
|
|
|
76
88
|
},
|
|
77
89
|
file_name: part.filename || `document-${index}.pdf`,
|
|
78
90
|
};
|
|
79
|
-
} else if (
|
|
80
|
-
getTopLevelMediaType(part.mediaType) === 'image'
|
|
81
|
-
) {
|
|
91
|
+
} else if (topLevelMediaType === 'image') {
|
|
82
92
|
return part.data.type === 'url'
|
|
83
93
|
? {
|
|
84
94
|
type: 'image_url',
|
|
@@ -97,7 +107,9 @@ export function convertToPerplexityMessages(
|
|
|
97
107
|
},
|
|
98
108
|
};
|
|
99
109
|
}
|
|
100
|
-
|
|
110
|
+
throw new UnsupportedFunctionalityError({
|
|
111
|
+
functionality: `file part media type ${part.mediaType}`,
|
|
112
|
+
});
|
|
101
113
|
}
|
|
102
114
|
}
|
|
103
115
|
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
|
|
3
|
+
export const perplexityLanguageModelOptions = z.looseObject({
|
|
4
|
+
/**
|
|
5
|
+
* Filters search results to those published within the specified time window.
|
|
6
|
+
* Cannot be combined with other date filters.
|
|
7
|
+
*/
|
|
8
|
+
search_recency_filter: z
|
|
9
|
+
.enum(['hour', 'day', 'week', 'month', 'year'])
|
|
10
|
+
.optional(),
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Restrict web search results to specific domains or URLs.
|
|
14
|
+
* Prefix a domain with "-" to exclude it.
|
|
15
|
+
*/
|
|
16
|
+
search_domain_filter: z.array(z.string()).optional(),
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Filter search results by language using ISO 639-1 codes.
|
|
20
|
+
*/
|
|
21
|
+
search_language_filter: z.array(z.string()).optional(),
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Return search results published after this date.
|
|
25
|
+
*/
|
|
26
|
+
search_after_date_filter: z.string().optional(),
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Return search results published before this date.
|
|
30
|
+
*/
|
|
31
|
+
search_before_date_filter: z.string().optional(),
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Return search results last updated after this date.
|
|
35
|
+
*/
|
|
36
|
+
last_updated_after_filter: z.string().optional(),
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Return search results last updated before this date.
|
|
40
|
+
*/
|
|
41
|
+
last_updated_before_filter: z.string().optional(),
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Source of search results.
|
|
45
|
+
*/
|
|
46
|
+
search_mode: z.enum(['web', 'academic', 'sec']).optional(),
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* If true, the model decides whether web search is needed.
|
|
50
|
+
*/
|
|
51
|
+
enable_search_classifier: z.boolean().optional(),
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* If true, disables web search.
|
|
55
|
+
*/
|
|
56
|
+
disable_search: z.boolean().optional(),
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* If true, a list of related questions is included in the response.
|
|
60
|
+
*/
|
|
61
|
+
return_related_questions: z.boolean().optional(),
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* If true, image search results are included in the response.
|
|
65
|
+
*/
|
|
66
|
+
return_images: z.boolean().optional(),
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Restrict image results to specific domains.
|
|
70
|
+
* Prefix a domain with "-" to exclude it.
|
|
71
|
+
*/
|
|
72
|
+
image_domain_filter: z.array(z.string()).optional(),
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Restrict image results to specific file formats.
|
|
76
|
+
*/
|
|
77
|
+
image_format_filter: z.array(z.string()).optional(),
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Additional media response configuration.
|
|
81
|
+
*/
|
|
82
|
+
media_response: z
|
|
83
|
+
.looseObject({
|
|
84
|
+
overrides: z
|
|
85
|
+
.looseObject({
|
|
86
|
+
/**
|
|
87
|
+
* If true, video results are included in the response.
|
|
88
|
+
*/
|
|
89
|
+
return_videos: z.boolean().optional(),
|
|
90
|
+
})
|
|
91
|
+
.optional(),
|
|
92
|
+
})
|
|
93
|
+
.optional(),
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Controls the format of streaming events.
|
|
97
|
+
*/
|
|
98
|
+
stream_mode: z.enum(['full', 'concise']).optional(),
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Controls how much effort the model spends on reasoning.
|
|
102
|
+
*/
|
|
103
|
+
reasoning_effort: z.enum(['minimal', 'low', 'medium', 'high']).optional(),
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Preferred response language as an ISO 639-1 language code.
|
|
107
|
+
*/
|
|
108
|
+
language_preference: z.string().optional(),
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Additional web search configuration.
|
|
112
|
+
*/
|
|
113
|
+
web_search_options: z
|
|
114
|
+
.looseObject({
|
|
115
|
+
/**
|
|
116
|
+
* Controls the size of search context injected into the model.
|
|
117
|
+
*/
|
|
118
|
+
search_context_size: z.enum(['low', 'medium', 'high']).optional(),
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Controls whether to use fast search, pro search, or automatic routing.
|
|
122
|
+
*/
|
|
123
|
+
search_type: z.enum(['fast', 'pro', 'auto']).optional(),
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* User location for search result personalization.
|
|
127
|
+
*/
|
|
128
|
+
user_location: z
|
|
129
|
+
.looseObject({
|
|
130
|
+
latitude: z.number().optional(),
|
|
131
|
+
longitude: z.number().optional(),
|
|
132
|
+
country: z.string().optional(),
|
|
133
|
+
city: z.string().optional(),
|
|
134
|
+
region: z.string().optional(),
|
|
135
|
+
})
|
|
136
|
+
.optional(),
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* If true, applies enhanced relevance filtering to image results.
|
|
140
|
+
*/
|
|
141
|
+
image_results_enhanced_relevance: z.boolean().optional(),
|
|
142
|
+
})
|
|
143
|
+
.optional(),
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
export type PerplexityLanguageModelOptions = z.infer<
|
|
147
|
+
typeof perplexityLanguageModelOptions
|
|
148
|
+
>;
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
createJsonErrorResponseHandler,
|
|
15
15
|
createJsonResponseHandler,
|
|
16
16
|
isCustomReasoning,
|
|
17
|
+
parseProviderOptions,
|
|
17
18
|
postJsonToApi,
|
|
18
19
|
serializeModelOptions,
|
|
19
20
|
WORKFLOW_SERIALIZE,
|
|
@@ -25,6 +26,7 @@ import { z } from 'zod/v4';
|
|
|
25
26
|
import { convertPerplexityUsage } from './convert-perplexity-usage';
|
|
26
27
|
import { convertToPerplexityMessages } from './convert-to-perplexity-messages';
|
|
27
28
|
import { mapPerplexityFinishReason } from './map-perplexity-finish-reason';
|
|
29
|
+
import { perplexityLanguageModelOptions } from './perplexity-language-model-options';
|
|
28
30
|
import type { PerplexityLanguageModelId } from './perplexity-options';
|
|
29
31
|
|
|
30
32
|
type PerplexityChatConfig = {
|
|
@@ -68,7 +70,7 @@ export class PerplexityLanguageModel implements LanguageModelV4 {
|
|
|
68
70
|
// No URLs are supported.
|
|
69
71
|
};
|
|
70
72
|
|
|
71
|
-
private getArgs({
|
|
73
|
+
private async getArgs({
|
|
72
74
|
prompt,
|
|
73
75
|
maxOutputTokens,
|
|
74
76
|
temperature,
|
|
@@ -84,6 +86,13 @@ export class PerplexityLanguageModel implements LanguageModelV4 {
|
|
|
84
86
|
}: LanguageModelV4CallOptions) {
|
|
85
87
|
const warnings: SharedV4Warning[] = [];
|
|
86
88
|
|
|
89
|
+
const perplexityOptions =
|
|
90
|
+
(await parseProviderOptions({
|
|
91
|
+
provider: 'perplexity',
|
|
92
|
+
providerOptions,
|
|
93
|
+
schema: perplexityLanguageModelOptions,
|
|
94
|
+
})) ?? {};
|
|
95
|
+
|
|
87
96
|
if (topK != null) {
|
|
88
97
|
warnings.push({ type: 'unsupported', feature: 'topK' });
|
|
89
98
|
}
|
|
@@ -127,7 +136,7 @@ export class PerplexityLanguageModel implements LanguageModelV4 {
|
|
|
127
136
|
: undefined,
|
|
128
137
|
|
|
129
138
|
// provider extensions
|
|
130
|
-
...
|
|
139
|
+
...perplexityOptions,
|
|
131
140
|
|
|
132
141
|
// messages:
|
|
133
142
|
messages: convertToPerplexityMessages(prompt),
|
|
@@ -139,7 +148,7 @@ export class PerplexityLanguageModel implements LanguageModelV4 {
|
|
|
139
148
|
async doGenerate(
|
|
140
149
|
options: LanguageModelV4CallOptions,
|
|
141
150
|
): Promise<LanguageModelV4GenerateResult> {
|
|
142
|
-
const { args: body, warnings } = this.getArgs(options);
|
|
151
|
+
const { args: body, warnings } = await this.getArgs(options);
|
|
143
152
|
|
|
144
153
|
const {
|
|
145
154
|
responseHeaders,
|
|
@@ -225,7 +234,7 @@ export class PerplexityLanguageModel implements LanguageModelV4 {
|
|
|
225
234
|
async doStream(
|
|
226
235
|
options: LanguageModelV4CallOptions,
|
|
227
236
|
): Promise<LanguageModelV4StreamResult> {
|
|
228
|
-
const { args, warnings } = this.getArgs(options);
|
|
237
|
+
const { args, warnings } = await this.getArgs(options);
|
|
229
238
|
|
|
230
239
|
const body = { ...args, stream: true };
|
|
231
240
|
|