@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 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
- if (part.mediaType === "application/pdf") {
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 (getTopLevelMediaType(part.mediaType) === "image") {
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
- return void 0;
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
- ...(_a = providerOptions == null ? void 0 : providerOptions.perplexity) != null ? _a : {},
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 = z.object({
463
- input_tokens_cost: z.number().nullish(),
464
- output_tokens_cost: z.number().nullish(),
465
- request_cost: z.number().nullish(),
466
- total_cost: z.number().nullish()
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 = z.object({
469
- prompt_tokens: z.number(),
470
- completion_tokens: z.number(),
471
- total_tokens: z.number().nullish(),
472
- citation_tokens: z.number().nullish(),
473
- num_search_queries: z.number().nullish(),
474
- reasoning_tokens: z.number().nullish(),
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 = z.object({
478
- image_url: z.string(),
479
- origin_url: z.string(),
480
- height: z.number(),
481
- width: z.number()
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 = z.object({
484
- id: z.string(),
485
- created: z.number(),
486
- model: z.string(),
487
- choices: z.array(
488
- z.object({
489
- message: z.object({
490
- role: z.literal("assistant"),
491
- content: z.string()
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: z.string().nullish()
624
+ finish_reason: z2.string().nullish()
494
625
  })
495
626
  ),
496
- citations: z.array(z.string()).nullish(),
497
- images: z.array(perplexityImageSchema).nullish(),
627
+ citations: z2.array(z2.string()).nullish(),
628
+ images: z2.array(perplexityImageSchema).nullish(),
498
629
  usage: perplexityUsageSchema.nullish()
499
630
  });
500
- var perplexityChunkSchema = z.object({
501
- id: z.string(),
502
- created: z.number(),
503
- model: z.string(),
504
- choices: z.array(
505
- z.object({
506
- delta: z.object({
507
- role: z.literal("assistant").optional(),
508
- content: z.string().nullish()
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: z.string().nullish()
641
+ finish_reason: z2.string().nullish()
511
642
  })
512
643
  ),
513
- citations: z.array(z.string()).nullish(),
514
- images: z.array(perplexityImageSchema).nullish(),
644
+ citations: z2.array(z2.string()).nullish(),
645
+ images: z2.array(perplexityImageSchema).nullish(),
515
646
  usage: perplexityUsageSchema.nullish()
516
647
  });
517
- var perplexityErrorSchema = z.object({
518
- error: z.object({
519
- code: z.number(),
520
- message: z.string().nullish(),
521
- type: z.string().nullish()
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.6" : "0.0.0-test";
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":";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,OAGK;AACP,SAAS,SAAS;;;ACrBX,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,sBAAI,KAAK,cAAc,mBAAmB;AACxC,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,WACE,qBAAqB,KAAK,SAAS,MAAM,SACzC;AACA,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,yBAAO;AAAA,gBACT;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;;;AChIO,SAAS,0BACd,cACwC;AACxC,UAAQ,cAAc;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AHwBO,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,EAcQ,QAAQ;AAAA,IACd;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;AAnFjC;AAoFI,UAAM,WAA8B,CAAC;AAErC,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,IAAI,wDAAiB,eAAjB,YAA+B,CAAC;AAAA;AAAA,QAGpC,UAAU,4BAA4B,MAAM;AAAA,MAC9C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SACwC;AA5I5C;AA6II,UAAM,EAAE,MAAM,MAAM,SAAS,IAAI,KAAK,QAAQ,OAAO;AAErD,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;AAlO1C;AAmOI,UAAM,EAAE,MAAM,SAAS,IAAI,KAAK,QAAQ,OAAO;AAE/C,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;AA9SvC,gBAAAA,KAAAC,KAAA;AAgTY,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,uBAAuB,EAAE,OAAO;AAAA,EACpC,mBAAmB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACtC,oBAAoB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACvC,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,YAAY,EAAE,OAAO,EAAE,QAAQ;AACjC,CAAC;AAED,IAAM,wBAAwB,EAAE,OAAO;AAAA,EACrC,eAAe,EAAE,OAAO;AAAA,EACxB,mBAAmB,EAAE,OAAO;AAAA,EAC5B,cAAc,EAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,iBAAiB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACpC,oBAAoB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACvC,kBAAkB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACrC,MAAM,qBAAqB,QAAQ;AACrC,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,WAAW,EAAE,OAAO;AAAA,EACpB,YAAY,EAAE,OAAO;AAAA,EACrB,QAAQ,EAAE,OAAO;AAAA,EACjB,OAAO,EAAE,OAAO;AAClB,CAAC;AAID,IAAM,2BAA2B,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAAA,EAChB,SAAS,EAAE;AAAA,IACT,EAAE,OAAO;AAAA,MACP,SAAS,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,QAAQ,WAAW;AAAA,QAC3B,SAAS,EAAE,OAAO;AAAA,MACpB,CAAC;AAAA,MACD,eAAe,EAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EACA,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,EACvC,QAAQ,EAAE,MAAM,qBAAqB,EAAE,QAAQ;AAAA,EAC/C,OAAO,sBAAsB,QAAQ;AACvC,CAAC;AAID,IAAM,wBAAwB,EAAE,OAAO;AAAA,EACrC,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,OAAO,EAAE,OAAO;AAAA,EAChB,SAAS,EAAE;AAAA,IACT,EAAE,OAAO;AAAA,MACP,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,QAAQ,WAAW,EAAE,SAAS;AAAA,QACtC,SAAS,EAAE,OAAO,EAAE,QAAQ;AAAA,MAC9B,CAAC;AAAA,MACD,eAAe,EAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EACA,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,EACvC,QAAQ,EAAE,MAAM,qBAAqB,EAAE,QAAQ;AAAA,EAC/C,OAAO,sBAAsB,QAAQ;AACvC,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,OAAO,EAAE,OAAO;AAAA,IACd,MAAM,EAAE,OAAO;AAAA,IACf,SAAS,EAAE,OAAO,EAAE,QAAQ;AAAA,IAC5B,MAAM,EAAE,OAAO,EAAE,QAAQ;AAAA,EAC3B,CAAC;AACH,CAAC;AAID,IAAM,iBAAiB,CAAC,SAA8B;AApftD;AAqfE,UAAO,gBAAK,MAAM,YAAX,YAAsB,KAAK,MAAM,SAAjC,YAAyC;AAClD;;;AIpfO,IAAM,UACX,OACI,UACA;;;ALmDC,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":["_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"]}
@@ -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
- <Tabs items={['pnpm', 'npm', 'yarn', 'bun']}>
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 | Object Generation | Tool Usage | Tool Streaming |
205
- | --------------------- | ------------------- | ------------------- | ------------------- | ------------------- |
206
- | `sonar-deep-research` | <Cross size={18} /> | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
207
- | `sonar-reasoning-pro` | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
208
- | `sonar-reasoning` | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
209
- | `sonar-pro` | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
210
- | `sonar` | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
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.6",
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.2",
33
- "@ai-sdk/provider-utils": "5.0.5"
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
- if (part.mediaType === 'application/pdf') {
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
- return undefined;
110
+ throw new UnsupportedFunctionalityError({
111
+ functionality: `file part media type ${part.mediaType}`,
112
+ });
101
113
  }
102
114
  }
103
115
  }
package/src/index.ts CHANGED
@@ -3,4 +3,5 @@ export type {
3
3
  PerplexityProvider,
4
4
  PerplexityProviderSettings,
5
5
  } from './perplexity-provider';
6
+ export type { PerplexityLanguageModelOptions } from './perplexity-language-model-options';
6
7
  export { VERSION } from './version';
@@ -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
- ...(providerOptions?.perplexity ?? {}),
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