@ai-sdk/perplexity 0.0.8 → 1.0.0

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,16 @@
1
1
  # @ai-sdk/perplexity
2
2
 
3
+ ## 1.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 2e898b4: feat (provider/perplexity): rewrite provider and support sources
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [2e898b4]
12
+ - @ai-sdk/provider-utils@2.1.8
13
+
3
14
  ## 0.0.8
4
15
 
5
16
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,36 +1,17 @@
1
1
  import { ProviderV1, LanguageModelV1 } from '@ai-sdk/provider';
2
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
3
- import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';
4
- import { z } from 'zod';
5
3
 
6
- type PerplexityChatModelId = 'sonar-pro' | 'sonar' | (string & {});
7
- interface PerplexityChatSettings extends OpenAICompatibleChatSettings {
8
- }
4
+ type PerplexityLanguageModelId = 'sonar-reasoning-pro' | 'sonar-reasoning' | 'sonar-pro' | 'sonar' | (string & {});
9
5
 
10
- declare const perplexityErrorSchema: z.ZodObject<{
11
- code: z.ZodString;
12
- error: z.ZodString;
13
- }, "strip", z.ZodTypeAny, {
14
- code: string;
15
- error: string;
16
- }, {
17
- code: string;
18
- error: string;
19
- }>;
20
- type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;
21
6
  interface PerplexityProvider extends ProviderV1 {
22
7
  /**
23
8
  Creates an Perplexity chat model for text generation.
24
9
  */
25
- (modelId: PerplexityChatModelId, settings?: PerplexityChatSettings): LanguageModelV1;
10
+ (modelId: PerplexityLanguageModelId): LanguageModelV1;
26
11
  /**
27
12
  Creates an Perplexity language model for text generation.
28
13
  */
29
- languageModel(modelId: PerplexityChatModelId, settings?: PerplexityChatSettings): LanguageModelV1;
30
- /**
31
- Creates an Perplexity chat model for text generation.
32
- */
33
- chat: (modelId: PerplexityChatModelId, settings?: PerplexityChatSettings) => LanguageModelV1;
14
+ languageModel(modelId: PerplexityLanguageModelId): LanguageModelV1;
34
15
  }
35
16
  interface PerplexityProviderSettings {
36
17
  /**
@@ -54,4 +35,4 @@ interface PerplexityProviderSettings {
54
35
  declare function createPerplexity(options?: PerplexityProviderSettings): PerplexityProvider;
55
36
  declare const perplexity: PerplexityProvider;
56
37
 
57
- export { type PerplexityErrorData, type PerplexityProvider, type PerplexityProviderSettings, createPerplexity, perplexity };
38
+ export { type PerplexityProvider, type PerplexityProviderSettings, createPerplexity, perplexity };
package/dist/index.d.ts CHANGED
@@ -1,36 +1,17 @@
1
1
  import { ProviderV1, LanguageModelV1 } from '@ai-sdk/provider';
2
2
  import { FetchFunction } from '@ai-sdk/provider-utils';
3
- import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';
4
- import { z } from 'zod';
5
3
 
6
- type PerplexityChatModelId = 'sonar-pro' | 'sonar' | (string & {});
7
- interface PerplexityChatSettings extends OpenAICompatibleChatSettings {
8
- }
4
+ type PerplexityLanguageModelId = 'sonar-reasoning-pro' | 'sonar-reasoning' | 'sonar-pro' | 'sonar' | (string & {});
9
5
 
10
- declare const perplexityErrorSchema: z.ZodObject<{
11
- code: z.ZodString;
12
- error: z.ZodString;
13
- }, "strip", z.ZodTypeAny, {
14
- code: string;
15
- error: string;
16
- }, {
17
- code: string;
18
- error: string;
19
- }>;
20
- type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;
21
6
  interface PerplexityProvider extends ProviderV1 {
22
7
  /**
23
8
  Creates an Perplexity chat model for text generation.
24
9
  */
25
- (modelId: PerplexityChatModelId, settings?: PerplexityChatSettings): LanguageModelV1;
10
+ (modelId: PerplexityLanguageModelId): LanguageModelV1;
26
11
  /**
27
12
  Creates an Perplexity language model for text generation.
28
13
  */
29
- languageModel(modelId: PerplexityChatModelId, settings?: PerplexityChatSettings): LanguageModelV1;
30
- /**
31
- Creates an Perplexity chat model for text generation.
32
- */
33
- chat: (modelId: PerplexityChatModelId, settings?: PerplexityChatSettings) => LanguageModelV1;
14
+ languageModel(modelId: PerplexityLanguageModelId): LanguageModelV1;
34
15
  }
35
16
  interface PerplexityProviderSettings {
36
17
  /**
@@ -54,4 +35,4 @@ interface PerplexityProviderSettings {
54
35
  declare function createPerplexity(options?: PerplexityProviderSettings): PerplexityProvider;
55
36
  declare const perplexity: PerplexityProvider;
56
37
 
57
- export { type PerplexityErrorData, type PerplexityProvider, type PerplexityProviderSettings, createPerplexity, perplexity };
38
+ export { type PerplexityProvider, type PerplexityProviderSettings, createPerplexity, perplexity };
package/dist/index.js CHANGED
@@ -26,115 +26,405 @@ __export(src_exports, {
26
26
  module.exports = __toCommonJS(src_exports);
27
27
 
28
28
  // src/perplexity-provider.ts
29
- var import_provider = require("@ai-sdk/provider");
30
- var import_openai_compatible = require("@ai-sdk/openai-compatible");
29
+ var import_provider3 = require("@ai-sdk/provider");
31
30
  var import_provider_utils2 = require("@ai-sdk/provider-utils");
32
- var import_zod2 = require("zod");
33
31
 
34
- // src/perplexity-metadata-extractor.ts
32
+ // src/perplexity-language-model.ts
33
+ var import_provider2 = require("@ai-sdk/provider");
35
34
  var import_provider_utils = require("@ai-sdk/provider-utils");
36
35
  var import_zod = require("zod");
37
- var perplexityMetadataExtractor = {
38
- extractMetadata: ({ parsedBody }) => {
39
- var _a, _b, _c;
40
- const parsed = (0, import_provider_utils.safeValidateTypes)({
41
- value: parsedBody,
42
- schema: perplexityResponseSchema
36
+
37
+ // src/convert-to-perplexity-messages.ts
38
+ var import_provider = require("@ai-sdk/provider");
39
+ function convertToPerplexityMessages(prompt) {
40
+ const messages = [];
41
+ for (const { role, content } of prompt) {
42
+ switch (role) {
43
+ case "system": {
44
+ messages.push({ role: "system", content });
45
+ break;
46
+ }
47
+ case "user":
48
+ case "assistant": {
49
+ messages.push({
50
+ role,
51
+ content: content.map((part) => {
52
+ switch (part.type) {
53
+ case "text": {
54
+ return part.text;
55
+ }
56
+ case "image": {
57
+ throw new import_provider.UnsupportedFunctionalityError({
58
+ functionality: "Image content parts in user messages"
59
+ });
60
+ }
61
+ case "file": {
62
+ throw new import_provider.UnsupportedFunctionalityError({
63
+ functionality: "File content parts in user messages"
64
+ });
65
+ }
66
+ case "tool-call": {
67
+ throw new import_provider.UnsupportedFunctionalityError({
68
+ functionality: "Tool calls in assistant messages"
69
+ });
70
+ }
71
+ default: {
72
+ const _exhaustiveCheck = part;
73
+ throw new Error(`Unsupported part: ${_exhaustiveCheck}`);
74
+ }
75
+ }
76
+ }).join("")
77
+ });
78
+ break;
79
+ }
80
+ case "tool": {
81
+ throw new import_provider.UnsupportedFunctionalityError({
82
+ functionality: "Tool messages"
83
+ });
84
+ }
85
+ default: {
86
+ const _exhaustiveCheck = role;
87
+ throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
88
+ }
89
+ }
90
+ }
91
+ return messages;
92
+ }
93
+
94
+ // src/map-perplexity-finish-reason.ts
95
+ function mapPerplexityFinishReason(finishReason) {
96
+ switch (finishReason) {
97
+ case "stop":
98
+ case "length":
99
+ return finishReason;
100
+ default:
101
+ return "unknown";
102
+ }
103
+ }
104
+
105
+ // src/perplexity-language-model.ts
106
+ var PerplexityLanguageModel = class {
107
+ constructor(modelId, config) {
108
+ this.specificationVersion = "v1";
109
+ this.defaultObjectGenerationMode = "json";
110
+ this.supportsStructuredOutputs = true;
111
+ this.supportsImageUrls = false;
112
+ this.provider = "perplexity";
113
+ this.modelId = modelId;
114
+ this.config = config;
115
+ }
116
+ getArgs({
117
+ mode,
118
+ prompt,
119
+ maxTokens,
120
+ temperature,
121
+ topP,
122
+ topK,
123
+ frequencyPenalty,
124
+ presencePenalty,
125
+ stopSequences,
126
+ responseFormat,
127
+ seed,
128
+ providerMetadata
129
+ }) {
130
+ var _a;
131
+ const type = mode.type;
132
+ const warnings = [];
133
+ if (topK != null) {
134
+ warnings.push({
135
+ type: "unsupported-setting",
136
+ setting: "topK"
137
+ });
138
+ }
139
+ if (stopSequences != null) {
140
+ warnings.push({
141
+ type: "unsupported-setting",
142
+ setting: "stopSequences"
143
+ });
144
+ }
145
+ if (seed != null) {
146
+ warnings.push({
147
+ type: "unsupported-setting",
148
+ setting: "seed"
149
+ });
150
+ }
151
+ const baseArgs = {
152
+ // model id:
153
+ model: this.modelId,
154
+ // standardized settings:
155
+ frequency_penalty: frequencyPenalty,
156
+ max_tokens: maxTokens,
157
+ presence_penalty: presencePenalty,
158
+ temperature,
159
+ top_k: topK,
160
+ top_p: topP,
161
+ // response format:
162
+ response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" ? {
163
+ type: "json_schema",
164
+ json_schema: { schema: responseFormat.schema }
165
+ } : void 0,
166
+ // provider extensions
167
+ ...(_a = providerMetadata == null ? void 0 : providerMetadata.perplexity) != null ? _a : {},
168
+ // messages:
169
+ messages: convertToPerplexityMessages(prompt)
170
+ };
171
+ switch (type) {
172
+ case "regular": {
173
+ return { args: baseArgs, warnings };
174
+ }
175
+ case "object-json": {
176
+ return {
177
+ args: {
178
+ ...baseArgs,
179
+ response_format: {
180
+ type: "json_schema",
181
+ json_schema: { schema: mode.schema }
182
+ }
183
+ },
184
+ warnings
185
+ };
186
+ }
187
+ case "object-tool": {
188
+ throw new import_provider2.UnsupportedFunctionalityError({
189
+ functionality: "tool-mode object generation"
190
+ });
191
+ }
192
+ default: {
193
+ const _exhaustiveCheck = type;
194
+ throw new Error(`Unsupported type: ${_exhaustiveCheck}`);
195
+ }
196
+ }
197
+ }
198
+ async doGenerate(options) {
199
+ var _a, _b, _c, _d;
200
+ const { args, warnings } = this.getArgs(options);
201
+ const { responseHeaders, value: response } = await (0, import_provider_utils.postJsonToApi)({
202
+ url: `${this.config.baseURL}/chat/completions`,
203
+ headers: (0, import_provider_utils.combineHeaders)(this.config.headers(), options.headers),
204
+ body: args,
205
+ failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
206
+ errorSchema: perplexityErrorSchema,
207
+ errorToMessage: (data) => data.error
208
+ }),
209
+ successfulResponseHandler: (0, import_provider_utils.createJsonResponseHandler)(
210
+ perplexityResponseSchema
211
+ ),
212
+ abortSignal: options.abortSignal,
213
+ fetch: this.config.fetch
43
214
  });
44
- return !parsed.success ? void 0 : buildPerplexityMetadata(
45
- (_a = parsed.value.citations) != null ? _a : void 0,
46
- (_b = parsed.value.images) != null ? _b : void 0,
47
- (_c = parsed.value.usage) != null ? _c : void 0
48
- );
49
- },
50
- createStreamExtractor: () => {
51
- let citations;
52
- let images;
53
- let usage;
215
+ const { messages: rawPrompt, ...rawSettings } = args;
216
+ const choice = response.choices[0];
217
+ const text = choice.message.content;
54
218
  return {
55
- processChunk: (chunk) => {
56
- var _a, _b, _c;
57
- const parsed = (0, import_provider_utils.safeValidateTypes)({
58
- value: chunk,
59
- schema: perplexityStreamChunkSchema
60
- });
61
- if (parsed.success) {
62
- citations = (_a = parsed.value.citations) != null ? _a : citations;
63
- images = (_b = parsed.value.images) != null ? _b : images;
64
- usage = (_c = parsed.value.usage) != null ? _c : usage;
65
- }
219
+ text,
220
+ toolCalls: [],
221
+ finishReason: mapPerplexityFinishReason(choice.finish_reason),
222
+ usage: {
223
+ promptTokens: response.usage.prompt_tokens,
224
+ completionTokens: response.usage.completion_tokens
66
225
  },
67
- buildMetadata: () => buildPerplexityMetadata(citations, images, usage)
226
+ rawCall: { rawPrompt, rawSettings },
227
+ rawResponse: { headers: responseHeaders },
228
+ request: { body: JSON.stringify(args) },
229
+ response: getResponseMetadata(response),
230
+ warnings,
231
+ sources: response.citations.map((url) => ({
232
+ sourceType: "url",
233
+ id: this.config.generateId(),
234
+ url
235
+ })),
236
+ providerMetadata: {
237
+ perplexity: {
238
+ images: (_b = (_a = response.images) == null ? void 0 : _a.map((image) => ({
239
+ imageUrl: image.image_url,
240
+ originUrl: image.origin_url,
241
+ height: image.height,
242
+ width: image.width
243
+ }))) != null ? _b : null,
244
+ usage: {
245
+ citationTokens: (_c = response.usage.citation_tokens) != null ? _c : null,
246
+ numSearchQueries: (_d = response.usage.num_search_queries) != null ? _d : null
247
+ }
248
+ }
249
+ }
68
250
  };
69
251
  }
70
- };
71
- var buildPerplexityMetadata = (citations, images, usage) => {
72
- var _a, _b;
73
- return citations || images || usage ? {
74
- perplexity: {
75
- ...citations && { citations },
76
- ...images && {
77
- images: images.map((image) => ({
78
- imageUrl: image.image_url,
79
- originUrl: image.origin_url,
80
- height: image.height,
81
- width: image.width
82
- }))
83
- },
84
- ...usage && {
252
+ async doStream(options) {
253
+ const { args, warnings } = this.getArgs(options);
254
+ const body = { ...args, stream: true };
255
+ const { responseHeaders, value: response } = await (0, import_provider_utils.postJsonToApi)({
256
+ url: `${this.config.baseURL}/chat/completions`,
257
+ headers: (0, import_provider_utils.combineHeaders)(this.config.headers(), options.headers),
258
+ body,
259
+ failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
260
+ errorSchema: perplexityErrorSchema,
261
+ errorToMessage: (data) => data.error
262
+ }),
263
+ successfulResponseHandler: (0, import_provider_utils.createEventSourceResponseHandler)(
264
+ perplexityChunkSchema
265
+ ),
266
+ abortSignal: options.abortSignal,
267
+ fetch: this.config.fetch
268
+ });
269
+ const { messages: rawPrompt, ...rawSettings } = args;
270
+ let finishReason = "unknown";
271
+ let usage = {
272
+ promptTokens: Number.NaN,
273
+ completionTokens: Number.NaN
274
+ };
275
+ const providerMetadata = {
276
+ perplexity: {
85
277
  usage: {
86
- citationTokens: (_a = usage.citation_tokens) != null ? _a : NaN,
87
- numSearchQueries: (_b = usage.num_search_queries) != null ? _b : NaN
88
- }
278
+ citationTokens: null,
279
+ numSearchQueries: null
280
+ },
281
+ images: null
89
282
  }
90
- }
91
- } : void 0;
283
+ };
284
+ let isFirstChunk = true;
285
+ const self = this;
286
+ return {
287
+ stream: response.pipeThrough(
288
+ new TransformStream({
289
+ transform(chunk, controller) {
290
+ var _a, _b, _c;
291
+ if (!chunk.success) {
292
+ controller.enqueue({ type: "error", error: chunk.error });
293
+ return;
294
+ }
295
+ const value = chunk.value;
296
+ if (isFirstChunk) {
297
+ controller.enqueue({
298
+ type: "response-metadata",
299
+ ...getResponseMetadata(value)
300
+ });
301
+ (_a = value.citations) == null ? void 0 : _a.forEach((url) => {
302
+ controller.enqueue({
303
+ type: "source",
304
+ source: {
305
+ sourceType: "url",
306
+ id: self.config.generateId(),
307
+ url
308
+ }
309
+ });
310
+ });
311
+ isFirstChunk = false;
312
+ }
313
+ if (value.usage != null) {
314
+ usage = {
315
+ promptTokens: value.usage.prompt_tokens,
316
+ completionTokens: value.usage.completion_tokens
317
+ };
318
+ providerMetadata.perplexity.usage = {
319
+ citationTokens: (_b = value.usage.citation_tokens) != null ? _b : null,
320
+ numSearchQueries: (_c = value.usage.num_search_queries) != null ? _c : null
321
+ };
322
+ }
323
+ if (value.images != null) {
324
+ providerMetadata.perplexity.images = value.images.map((image) => ({
325
+ imageUrl: image.image_url,
326
+ originUrl: image.origin_url,
327
+ height: image.height,
328
+ width: image.width
329
+ }));
330
+ }
331
+ const choice = value.choices[0];
332
+ if ((choice == null ? void 0 : choice.finish_reason) != null) {
333
+ finishReason = mapPerplexityFinishReason(choice.finish_reason);
334
+ }
335
+ if ((choice == null ? void 0 : choice.delta) == null) {
336
+ return;
337
+ }
338
+ const delta = choice.delta;
339
+ const textContent = delta.content;
340
+ if (textContent != null) {
341
+ controller.enqueue({
342
+ type: "text-delta",
343
+ textDelta: textContent
344
+ });
345
+ }
346
+ },
347
+ flush(controller) {
348
+ controller.enqueue({
349
+ type: "finish",
350
+ finishReason,
351
+ usage,
352
+ providerMetadata
353
+ });
354
+ }
355
+ })
356
+ ),
357
+ rawCall: { rawPrompt, rawSettings },
358
+ rawResponse: { headers: responseHeaders },
359
+ request: { body: JSON.stringify(body) },
360
+ warnings
361
+ };
362
+ }
92
363
  };
93
- var perplexityCitationSchema = import_zod.z.array(import_zod.z.string());
364
+ function getResponseMetadata({
365
+ id,
366
+ model,
367
+ created
368
+ }) {
369
+ return {
370
+ id,
371
+ modelId: model,
372
+ timestamp: new Date(created * 1e3)
373
+ };
374
+ }
375
+ var perplexityUsageSchema = import_zod.z.object({
376
+ prompt_tokens: import_zod.z.number(),
377
+ completion_tokens: import_zod.z.number(),
378
+ citation_tokens: import_zod.z.number().nullish(),
379
+ num_search_queries: import_zod.z.number().nullish()
380
+ });
94
381
  var perplexityImageSchema = import_zod.z.object({
95
382
  image_url: import_zod.z.string(),
96
383
  origin_url: import_zod.z.string(),
97
384
  height: import_zod.z.number(),
98
385
  width: import_zod.z.number()
99
386
  });
100
- var perplexityUsageSchema = import_zod.z.object({
101
- citation_tokens: import_zod.z.number().nullish(),
102
- num_search_queries: import_zod.z.number().nullish()
103
- });
104
387
  var perplexityResponseSchema = import_zod.z.object({
105
- citations: perplexityCitationSchema.nullish(),
388
+ id: import_zod.z.string(),
389
+ created: import_zod.z.number(),
390
+ model: import_zod.z.string(),
391
+ choices: import_zod.z.array(
392
+ import_zod.z.object({
393
+ message: import_zod.z.object({
394
+ role: import_zod.z.literal("assistant"),
395
+ content: import_zod.z.string()
396
+ }),
397
+ finish_reason: import_zod.z.string()
398
+ })
399
+ ),
400
+ citations: import_zod.z.array(import_zod.z.string()),
106
401
  images: import_zod.z.array(perplexityImageSchema).nullish(),
107
- usage: perplexityUsageSchema.nullish()
402
+ usage: perplexityUsageSchema
108
403
  });
109
- var perplexityStreamChunkSchema = import_zod.z.object({
404
+ var perplexityChunkSchema = import_zod.z.object({
405
+ id: import_zod.z.string(),
406
+ created: import_zod.z.number(),
407
+ model: import_zod.z.string(),
110
408
  choices: import_zod.z.array(
111
409
  import_zod.z.object({
112
- finish_reason: import_zod.z.string().nullish(),
113
410
  delta: import_zod.z.object({
114
- role: import_zod.z.string(),
411
+ role: import_zod.z.literal("assistant"),
115
412
  content: import_zod.z.string()
116
- }).nullish()
413
+ }),
414
+ finish_reason: import_zod.z.string().nullish()
117
415
  })
118
- ).nullish(),
119
- citations: perplexityCitationSchema.nullish(),
416
+ ),
417
+ citations: import_zod.z.array(import_zod.z.string()).nullish(),
120
418
  images: import_zod.z.array(perplexityImageSchema).nullish(),
121
419
  usage: perplexityUsageSchema.nullish()
122
420
  });
421
+ var perplexityErrorSchema = import_zod.z.object({
422
+ code: import_zod.z.string(),
423
+ error: import_zod.z.string()
424
+ });
123
425
 
124
426
  // src/perplexity-provider.ts
125
- var perplexityErrorSchema = import_zod2.z.object({
126
- code: import_zod2.z.string(),
127
- error: import_zod2.z.string()
128
- });
129
- var perplexityErrorStructure = {
130
- errorSchema: perplexityErrorSchema,
131
- errorToMessage: (data) => data.error
132
- };
133
427
  function createPerplexity(options = {}) {
134
- var _a;
135
- const baseURL = (0, import_provider_utils2.withoutTrailingSlash)(
136
- (_a = options.baseURL) != null ? _a : "https://api.perplexity.ai"
137
- );
138
428
  const getHeaders = () => ({
139
429
  Authorization: `Bearer ${(0, import_provider_utils2.loadApiKey)({
140
430
  apiKey: options.apiKey,
@@ -143,23 +433,21 @@ function createPerplexity(options = {}) {
143
433
  })}`,
144
434
  ...options.headers
145
435
  });
146
- const createLanguageModel = (modelId, settings = {}) => {
147
- return new import_openai_compatible.OpenAICompatibleChatLanguageModel(modelId, settings, {
148
- provider: "perplexity.chat",
149
- url: ({ path }) => `${baseURL}${path}`,
436
+ const createLanguageModel = (modelId) => {
437
+ var _a;
438
+ return new PerplexityLanguageModel(modelId, {
439
+ baseURL: (0, import_provider_utils2.withoutTrailingSlash)(
440
+ (_a = options.baseURL) != null ? _a : "https://api.perplexity.ai"
441
+ ),
150
442
  headers: getHeaders,
151
- fetch: options.fetch,
152
- defaultObjectGenerationMode: "json",
153
- errorStructure: perplexityErrorStructure,
154
- metadataExtractor: perplexityMetadataExtractor,
155
- supportsStructuredOutputs: true
443
+ generateId: import_provider_utils2.generateId,
444
+ fetch: options.fetch
156
445
  });
157
446
  };
158
- const provider = (modelId, settings) => createLanguageModel(modelId, settings);
447
+ const provider = (modelId) => createLanguageModel(modelId);
159
448
  provider.languageModel = createLanguageModel;
160
- provider.chat = createLanguageModel;
161
449
  provider.textEmbeddingModel = (modelId) => {
162
- throw new import_provider.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
450
+ throw new import_provider3.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
163
451
  };
164
452
  return provider;
165
453
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/perplexity-provider.ts","../src/perplexity-metadata-extractor.ts"],"sourcesContent":["export { createPerplexity, perplexity } from './perplexity-provider';\nexport type {\n PerplexityErrorData,\n PerplexityProvider,\n PerplexityProviderSettings,\n} from './perplexity-provider';\n","import {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n PerplexityChatModelId,\n PerplexityChatSettings,\n} from './perplexity-chat-settings';\nimport { z } from 'zod';\nimport { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { perplexityMetadataExtractor } from './perplexity-metadata-extractor';\n\n// Add error schema and structure\nconst perplexityErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;\n\nconst perplexityErrorStructure: ProviderErrorStructure<PerplexityErrorData> = {\n errorSchema: perplexityErrorSchema,\n errorToMessage: data => data.error,\n};\n\nexport interface PerplexityProvider extends ProviderV1 {\n /**\nCreates an Perplexity chat model for text generation.\n */\n (\n modelId: PerplexityChatModelId,\n settings?: PerplexityChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates an Perplexity language model for text generation.\n */\n languageModel(\n modelId: PerplexityChatModelId,\n settings?: PerplexityChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates an Perplexity chat model for text generation.\n */\n chat: (\n modelId: PerplexityChatModelId,\n settings?: PerplexityChatSettings,\n ) => LanguageModelV1;\n}\n\nexport interface PerplexityProviderSettings {\n /**\nBase URL for the perplexity API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor 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 baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.perplexity.ai',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PERPLEXITY_API_KEY',\n description: 'Perplexity',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: PerplexityChatModelId,\n settings: PerplexityChatSettings = {},\n ) => {\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: 'perplexity.chat',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: 'json',\n errorStructure: perplexityErrorStructure,\n metadataExtractor: perplexityMetadataExtractor,\n supportsStructuredOutputs: true,\n });\n };\n\n const provider = (\n modelId: PerplexityChatModelId,\n settings?: PerplexityChatSettings,\n ) => createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const perplexity = createPerplexity();\n","import { MetadataExtractor } from '@ai-sdk/openai-compatible';\nimport { safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nexport const perplexityMetadataExtractor: MetadataExtractor = {\n extractMetadata: ({ parsedBody }: { parsedBody: unknown }) => {\n const parsed = safeValidateTypes({\n value: parsedBody,\n schema: perplexityResponseSchema,\n });\n\n return !parsed.success\n ? undefined\n : buildPerplexityMetadata(\n parsed.value.citations ?? undefined,\n parsed.value.images ?? undefined,\n parsed.value.usage ?? undefined,\n );\n },\n\n createStreamExtractor: () => {\n let citations: string[] | undefined;\n let images: PerplexityImageData[] | undefined;\n let usage: PerplexityUsageData | undefined;\n\n return {\n processChunk: (chunk: unknown) => {\n const parsed = safeValidateTypes({\n value: chunk,\n schema: perplexityStreamChunkSchema,\n });\n\n if (parsed.success) {\n citations = parsed.value.citations ?? citations;\n images = parsed.value.images ?? images;\n usage = parsed.value.usage ?? usage;\n }\n },\n buildMetadata: () => buildPerplexityMetadata(citations, images, usage),\n };\n },\n};\n\nconst buildPerplexityMetadata = (\n citations: string[] | undefined,\n images: PerplexityImageData[] | undefined,\n usage: PerplexityUsageData | undefined,\n) => {\n return citations || images || usage\n ? {\n perplexity: {\n ...(citations && { citations }),\n ...(images && {\n images: images.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n })),\n }),\n ...(usage && {\n usage: {\n citationTokens: usage.citation_tokens ?? NaN,\n numSearchQueries: usage.num_search_queries ?? NaN,\n },\n }),\n },\n }\n : undefined;\n};\n\nconst perplexityCitationSchema = z.array(z.string());\n\nconst perplexityImageSchema = z.object({\n image_url: z.string(),\n origin_url: z.string(),\n height: z.number(),\n width: z.number(),\n});\n\ntype PerplexityImageData = z.infer<typeof perplexityImageSchema>;\n\nconst perplexityUsageSchema = z.object({\n citation_tokens: z.number().nullish(),\n num_search_queries: z.number().nullish(),\n});\n\ntype PerplexityUsageData = z.infer<typeof perplexityUsageSchema>;\n\nconst perplexityResponseSchema = z.object({\n citations: perplexityCitationSchema.nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n\nconst perplexityStreamChunkSchema = z.object({\n choices: z\n .array(\n z.object({\n finish_reason: z.string().nullish(),\n delta: z\n .object({\n role: z.string(),\n content: z.string(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n citations: perplexityCitationSchema.nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n"],"mappings":"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","names":["import_provider_utils","import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/perplexity-provider.ts","../src/perplexity-language-model.ts","../src/convert-to-perplexity-messages.ts","../src/map-perplexity-finish-reason.ts"],"sourcesContent":["export { createPerplexity, perplexity } from './perplexity-provider';\nexport type {\n PerplexityProvider,\n PerplexityProviderSettings,\n} from './perplexity-provider';\n","import {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { PerplexityLanguageModel } from './perplexity-language-model';\nimport { PerplexityLanguageModelId } from './perplexity-language-model-settings';\n\nexport interface PerplexityProvider extends ProviderV1 {\n /**\nCreates an Perplexity chat model for text generation.\n */\n (modelId: PerplexityLanguageModelId): LanguageModelV1;\n\n /**\nCreates an Perplexity language model for text generation.\n */\n languageModel(modelId: PerplexityLanguageModelId): LanguageModelV1;\n}\n\nexport interface PerplexityProviderSettings {\n /**\nBase URL for the perplexity API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor 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 Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PERPLEXITY_API_KEY',\n description: 'Perplexity',\n })}`,\n ...options.headers,\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.languageModel = createLanguageModel;\n\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const perplexity = createPerplexity();\n","import {\n LanguageModelV1,\n LanguageModelV1CallWarning,\n LanguageModelV1FinishReason,\n LanguageModelV1StreamPart,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport { PerplexityLanguageModelId } from './perplexity-language-model-settings';\nimport { convertToPerplexityMessages } from './convert-to-perplexity-messages';\nimport { mapPerplexityFinishReason } from './map-perplexity-finish-reason';\n\ntype PerplexityChatConfig = {\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n generateId: () => string;\n fetch?: FetchFunction;\n};\n\nexport class PerplexityLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = 'v1';\n readonly defaultObjectGenerationMode = 'json';\n readonly supportsStructuredOutputs = true;\n readonly supportsImageUrls = false;\n readonly provider = 'perplexity';\n\n readonly modelId: PerplexityLanguageModelId;\n\n private readonly config: PerplexityChatConfig;\n\n constructor(\n modelId: PerplexityLanguageModelId,\n config: PerplexityChatConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n private getArgs({\n mode,\n prompt,\n maxTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n providerMetadata,\n }: Parameters<LanguageModelV1['doGenerate']>[0]) {\n const type = mode.type;\n\n const warnings: LanguageModelV1CallWarning[] = [];\n\n if (topK != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'topK',\n });\n }\n\n if (stopSequences != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'stopSequences',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'seed',\n });\n }\n\n const baseArgs = {\n // model id:\n model: this.modelId,\n\n // standardized settings:\n frequency_penalty: frequencyPenalty,\n max_tokens: maxTokens,\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 ...(providerMetadata?.perplexity ?? {}),\n\n // messages:\n messages: convertToPerplexityMessages(prompt),\n };\n\n switch (type) {\n case 'regular': {\n return { args: baseArgs, warnings };\n }\n\n case 'object-json': {\n return {\n args: {\n ...baseArgs,\n response_format: {\n type: 'json_schema',\n json_schema: { schema: mode.schema },\n },\n },\n warnings,\n };\n }\n\n case 'object-tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool-mode object generation',\n });\n }\n\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Unsupported type: ${_exhaustiveCheck}`);\n }\n }\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV1['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1['doGenerate']>>> {\n const { args, warnings } = this.getArgs(options);\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: args,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: perplexityErrorSchema,\n errorToMessage: data => data.error,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n perplexityResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { messages: rawPrompt, ...rawSettings } = args;\n const choice = response.choices[0];\n const text = choice.message.content;\n\n return {\n text,\n toolCalls: [],\n finishReason: mapPerplexityFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n },\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n request: { body: JSON.stringify(args) },\n response: getResponseMetadata(response),\n warnings,\n sources: response.citations.map(url => ({\n sourceType: 'url',\n id: this.config.generateId(),\n url,\n })),\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 },\n },\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV1['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1['doStream']>>> {\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: data => data.error,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(\n perplexityChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { messages: rawPrompt, ...rawSettings } = args;\n\n let finishReason: LanguageModelV1FinishReason = 'unknown';\n let usage: { promptTokens: number; completionTokens: number } = {\n promptTokens: Number.NaN,\n completionTokens: Number.NaN,\n };\n const providerMetadata: {\n perplexity: {\n usage: {\n citationTokens: number | null;\n numSearchQueries: number | null;\n };\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 images: null,\n },\n };\n let isFirstChunk = true;\n\n const self = this;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof perplexityChunkSchema>>,\n LanguageModelV1StreamPart\n >({\n transform(chunk, controller) {\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 source: {\n sourceType: 'url',\n id: self.config.generateId(),\n url,\n },\n });\n });\n\n isFirstChunk = false;\n }\n\n if (value.usage != null) {\n usage = {\n promptTokens: value.usage.prompt_tokens,\n completionTokens: value.usage.completion_tokens,\n };\n\n providerMetadata.perplexity.usage = {\n citationTokens: value.usage.citation_tokens ?? null,\n numSearchQueries: value.usage.num_search_queries ?? null,\n };\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 = mapPerplexityFinishReason(choice.finish_reason);\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 controller.enqueue({\n type: 'text-delta',\n textDelta: textContent,\n });\n }\n },\n\n flush(controller) {\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n providerMetadata,\n });\n },\n }),\n ),\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n request: { body: JSON.stringify(body) },\n warnings,\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 perplexityUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n citation_tokens: z.number().nullish(),\n num_search_queries: z.number().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(),\n }),\n ),\n citations: z.array(z.string()),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema,\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'),\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\nexport const perplexityErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;\n","import {\n LanguageModelV1Prompt,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport { PerplexityPrompt } from './perplexity-language-model-prompt';\n\nexport function convertToPerplexityMessages(\n prompt: LanguageModelV1Prompt,\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 messages.push({\n role,\n content: content\n .map(part => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n case 'image': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Image content parts in user messages',\n });\n }\n case 'file': {\n throw new UnsupportedFunctionalityError({\n functionality: 'File content parts in user messages',\n });\n }\n case 'tool-call': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Tool calls in assistant messages',\n });\n }\n default: {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n })\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 { LanguageModelV1FinishReason } from '@ai-sdk/provider';\n\nexport function mapPerplexityFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV1FinishReason {\n switch (finishReason) {\n case 'stop':\n case 'length':\n return finishReason;\n default:\n return 'unknown';\n }\n}\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_provider"]}
package/dist/index.mjs CHANGED
@@ -2,117 +2,418 @@
2
2
  import {
3
3
  NoSuchModelError
4
4
  } from "@ai-sdk/provider";
5
- import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
6
5
  import {
6
+ generateId,
7
7
  loadApiKey,
8
8
  withoutTrailingSlash
9
9
  } from "@ai-sdk/provider-utils";
10
- import { z as z2 } from "zod";
11
10
 
12
- // src/perplexity-metadata-extractor.ts
13
- import { safeValidateTypes } from "@ai-sdk/provider-utils";
11
+ // src/perplexity-language-model.ts
12
+ import {
13
+ UnsupportedFunctionalityError as UnsupportedFunctionalityError2
14
+ } from "@ai-sdk/provider";
15
+ import {
16
+ combineHeaders,
17
+ createEventSourceResponseHandler,
18
+ createJsonErrorResponseHandler,
19
+ createJsonResponseHandler,
20
+ postJsonToApi
21
+ } from "@ai-sdk/provider-utils";
14
22
  import { z } from "zod";
15
- var perplexityMetadataExtractor = {
16
- extractMetadata: ({ parsedBody }) => {
17
- var _a, _b, _c;
18
- const parsed = safeValidateTypes({
19
- value: parsedBody,
20
- schema: perplexityResponseSchema
23
+
24
+ // src/convert-to-perplexity-messages.ts
25
+ import {
26
+ UnsupportedFunctionalityError
27
+ } from "@ai-sdk/provider";
28
+ function convertToPerplexityMessages(prompt) {
29
+ const messages = [];
30
+ for (const { role, content } of prompt) {
31
+ switch (role) {
32
+ case "system": {
33
+ messages.push({ role: "system", content });
34
+ break;
35
+ }
36
+ case "user":
37
+ case "assistant": {
38
+ messages.push({
39
+ role,
40
+ content: content.map((part) => {
41
+ switch (part.type) {
42
+ case "text": {
43
+ return part.text;
44
+ }
45
+ case "image": {
46
+ throw new UnsupportedFunctionalityError({
47
+ functionality: "Image content parts in user messages"
48
+ });
49
+ }
50
+ case "file": {
51
+ throw new UnsupportedFunctionalityError({
52
+ functionality: "File content parts in user messages"
53
+ });
54
+ }
55
+ case "tool-call": {
56
+ throw new UnsupportedFunctionalityError({
57
+ functionality: "Tool calls in assistant messages"
58
+ });
59
+ }
60
+ default: {
61
+ const _exhaustiveCheck = part;
62
+ throw new Error(`Unsupported part: ${_exhaustiveCheck}`);
63
+ }
64
+ }
65
+ }).join("")
66
+ });
67
+ break;
68
+ }
69
+ case "tool": {
70
+ throw new UnsupportedFunctionalityError({
71
+ functionality: "Tool messages"
72
+ });
73
+ }
74
+ default: {
75
+ const _exhaustiveCheck = role;
76
+ throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
77
+ }
78
+ }
79
+ }
80
+ return messages;
81
+ }
82
+
83
+ // src/map-perplexity-finish-reason.ts
84
+ function mapPerplexityFinishReason(finishReason) {
85
+ switch (finishReason) {
86
+ case "stop":
87
+ case "length":
88
+ return finishReason;
89
+ default:
90
+ return "unknown";
91
+ }
92
+ }
93
+
94
+ // src/perplexity-language-model.ts
95
+ var PerplexityLanguageModel = class {
96
+ constructor(modelId, config) {
97
+ this.specificationVersion = "v1";
98
+ this.defaultObjectGenerationMode = "json";
99
+ this.supportsStructuredOutputs = true;
100
+ this.supportsImageUrls = false;
101
+ this.provider = "perplexity";
102
+ this.modelId = modelId;
103
+ this.config = config;
104
+ }
105
+ getArgs({
106
+ mode,
107
+ prompt,
108
+ maxTokens,
109
+ temperature,
110
+ topP,
111
+ topK,
112
+ frequencyPenalty,
113
+ presencePenalty,
114
+ stopSequences,
115
+ responseFormat,
116
+ seed,
117
+ providerMetadata
118
+ }) {
119
+ var _a;
120
+ const type = mode.type;
121
+ const warnings = [];
122
+ if (topK != null) {
123
+ warnings.push({
124
+ type: "unsupported-setting",
125
+ setting: "topK"
126
+ });
127
+ }
128
+ if (stopSequences != null) {
129
+ warnings.push({
130
+ type: "unsupported-setting",
131
+ setting: "stopSequences"
132
+ });
133
+ }
134
+ if (seed != null) {
135
+ warnings.push({
136
+ type: "unsupported-setting",
137
+ setting: "seed"
138
+ });
139
+ }
140
+ const baseArgs = {
141
+ // model id:
142
+ model: this.modelId,
143
+ // standardized settings:
144
+ frequency_penalty: frequencyPenalty,
145
+ max_tokens: maxTokens,
146
+ presence_penalty: presencePenalty,
147
+ temperature,
148
+ top_k: topK,
149
+ top_p: topP,
150
+ // response format:
151
+ response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" ? {
152
+ type: "json_schema",
153
+ json_schema: { schema: responseFormat.schema }
154
+ } : void 0,
155
+ // provider extensions
156
+ ...(_a = providerMetadata == null ? void 0 : providerMetadata.perplexity) != null ? _a : {},
157
+ // messages:
158
+ messages: convertToPerplexityMessages(prompt)
159
+ };
160
+ switch (type) {
161
+ case "regular": {
162
+ return { args: baseArgs, warnings };
163
+ }
164
+ case "object-json": {
165
+ return {
166
+ args: {
167
+ ...baseArgs,
168
+ response_format: {
169
+ type: "json_schema",
170
+ json_schema: { schema: mode.schema }
171
+ }
172
+ },
173
+ warnings
174
+ };
175
+ }
176
+ case "object-tool": {
177
+ throw new UnsupportedFunctionalityError2({
178
+ functionality: "tool-mode object generation"
179
+ });
180
+ }
181
+ default: {
182
+ const _exhaustiveCheck = type;
183
+ throw new Error(`Unsupported type: ${_exhaustiveCheck}`);
184
+ }
185
+ }
186
+ }
187
+ async doGenerate(options) {
188
+ var _a, _b, _c, _d;
189
+ const { args, warnings } = this.getArgs(options);
190
+ const { responseHeaders, value: response } = await postJsonToApi({
191
+ url: `${this.config.baseURL}/chat/completions`,
192
+ headers: combineHeaders(this.config.headers(), options.headers),
193
+ body: args,
194
+ failedResponseHandler: createJsonErrorResponseHandler({
195
+ errorSchema: perplexityErrorSchema,
196
+ errorToMessage: (data) => data.error
197
+ }),
198
+ successfulResponseHandler: createJsonResponseHandler(
199
+ perplexityResponseSchema
200
+ ),
201
+ abortSignal: options.abortSignal,
202
+ fetch: this.config.fetch
21
203
  });
22
- return !parsed.success ? void 0 : buildPerplexityMetadata(
23
- (_a = parsed.value.citations) != null ? _a : void 0,
24
- (_b = parsed.value.images) != null ? _b : void 0,
25
- (_c = parsed.value.usage) != null ? _c : void 0
26
- );
27
- },
28
- createStreamExtractor: () => {
29
- let citations;
30
- let images;
31
- let usage;
204
+ const { messages: rawPrompt, ...rawSettings } = args;
205
+ const choice = response.choices[0];
206
+ const text = choice.message.content;
32
207
  return {
33
- processChunk: (chunk) => {
34
- var _a, _b, _c;
35
- const parsed = safeValidateTypes({
36
- value: chunk,
37
- schema: perplexityStreamChunkSchema
38
- });
39
- if (parsed.success) {
40
- citations = (_a = parsed.value.citations) != null ? _a : citations;
41
- images = (_b = parsed.value.images) != null ? _b : images;
42
- usage = (_c = parsed.value.usage) != null ? _c : usage;
43
- }
208
+ text,
209
+ toolCalls: [],
210
+ finishReason: mapPerplexityFinishReason(choice.finish_reason),
211
+ usage: {
212
+ promptTokens: response.usage.prompt_tokens,
213
+ completionTokens: response.usage.completion_tokens
44
214
  },
45
- buildMetadata: () => buildPerplexityMetadata(citations, images, usage)
215
+ rawCall: { rawPrompt, rawSettings },
216
+ rawResponse: { headers: responseHeaders },
217
+ request: { body: JSON.stringify(args) },
218
+ response: getResponseMetadata(response),
219
+ warnings,
220
+ sources: response.citations.map((url) => ({
221
+ sourceType: "url",
222
+ id: this.config.generateId(),
223
+ url
224
+ })),
225
+ providerMetadata: {
226
+ perplexity: {
227
+ images: (_b = (_a = response.images) == null ? void 0 : _a.map((image) => ({
228
+ imageUrl: image.image_url,
229
+ originUrl: image.origin_url,
230
+ height: image.height,
231
+ width: image.width
232
+ }))) != null ? _b : null,
233
+ usage: {
234
+ citationTokens: (_c = response.usage.citation_tokens) != null ? _c : null,
235
+ numSearchQueries: (_d = response.usage.num_search_queries) != null ? _d : null
236
+ }
237
+ }
238
+ }
46
239
  };
47
240
  }
48
- };
49
- var buildPerplexityMetadata = (citations, images, usage) => {
50
- var _a, _b;
51
- return citations || images || usage ? {
52
- perplexity: {
53
- ...citations && { citations },
54
- ...images && {
55
- images: images.map((image) => ({
56
- imageUrl: image.image_url,
57
- originUrl: image.origin_url,
58
- height: image.height,
59
- width: image.width
60
- }))
61
- },
62
- ...usage && {
241
+ async doStream(options) {
242
+ const { args, warnings } = this.getArgs(options);
243
+ const body = { ...args, stream: true };
244
+ const { responseHeaders, value: response } = await postJsonToApi({
245
+ url: `${this.config.baseURL}/chat/completions`,
246
+ headers: combineHeaders(this.config.headers(), options.headers),
247
+ body,
248
+ failedResponseHandler: createJsonErrorResponseHandler({
249
+ errorSchema: perplexityErrorSchema,
250
+ errorToMessage: (data) => data.error
251
+ }),
252
+ successfulResponseHandler: createEventSourceResponseHandler(
253
+ perplexityChunkSchema
254
+ ),
255
+ abortSignal: options.abortSignal,
256
+ fetch: this.config.fetch
257
+ });
258
+ const { messages: rawPrompt, ...rawSettings } = args;
259
+ let finishReason = "unknown";
260
+ let usage = {
261
+ promptTokens: Number.NaN,
262
+ completionTokens: Number.NaN
263
+ };
264
+ const providerMetadata = {
265
+ perplexity: {
63
266
  usage: {
64
- citationTokens: (_a = usage.citation_tokens) != null ? _a : NaN,
65
- numSearchQueries: (_b = usage.num_search_queries) != null ? _b : NaN
66
- }
267
+ citationTokens: null,
268
+ numSearchQueries: null
269
+ },
270
+ images: null
67
271
  }
68
- }
69
- } : void 0;
272
+ };
273
+ let isFirstChunk = true;
274
+ const self = this;
275
+ return {
276
+ stream: response.pipeThrough(
277
+ new TransformStream({
278
+ transform(chunk, controller) {
279
+ var _a, _b, _c;
280
+ if (!chunk.success) {
281
+ controller.enqueue({ type: "error", error: chunk.error });
282
+ return;
283
+ }
284
+ const value = chunk.value;
285
+ if (isFirstChunk) {
286
+ controller.enqueue({
287
+ type: "response-metadata",
288
+ ...getResponseMetadata(value)
289
+ });
290
+ (_a = value.citations) == null ? void 0 : _a.forEach((url) => {
291
+ controller.enqueue({
292
+ type: "source",
293
+ source: {
294
+ sourceType: "url",
295
+ id: self.config.generateId(),
296
+ url
297
+ }
298
+ });
299
+ });
300
+ isFirstChunk = false;
301
+ }
302
+ if (value.usage != null) {
303
+ usage = {
304
+ promptTokens: value.usage.prompt_tokens,
305
+ completionTokens: value.usage.completion_tokens
306
+ };
307
+ providerMetadata.perplexity.usage = {
308
+ citationTokens: (_b = value.usage.citation_tokens) != null ? _b : null,
309
+ numSearchQueries: (_c = value.usage.num_search_queries) != null ? _c : null
310
+ };
311
+ }
312
+ if (value.images != null) {
313
+ providerMetadata.perplexity.images = value.images.map((image) => ({
314
+ imageUrl: image.image_url,
315
+ originUrl: image.origin_url,
316
+ height: image.height,
317
+ width: image.width
318
+ }));
319
+ }
320
+ const choice = value.choices[0];
321
+ if ((choice == null ? void 0 : choice.finish_reason) != null) {
322
+ finishReason = mapPerplexityFinishReason(choice.finish_reason);
323
+ }
324
+ if ((choice == null ? void 0 : choice.delta) == null) {
325
+ return;
326
+ }
327
+ const delta = choice.delta;
328
+ const textContent = delta.content;
329
+ if (textContent != null) {
330
+ controller.enqueue({
331
+ type: "text-delta",
332
+ textDelta: textContent
333
+ });
334
+ }
335
+ },
336
+ flush(controller) {
337
+ controller.enqueue({
338
+ type: "finish",
339
+ finishReason,
340
+ usage,
341
+ providerMetadata
342
+ });
343
+ }
344
+ })
345
+ ),
346
+ rawCall: { rawPrompt, rawSettings },
347
+ rawResponse: { headers: responseHeaders },
348
+ request: { body: JSON.stringify(body) },
349
+ warnings
350
+ };
351
+ }
70
352
  };
71
- var perplexityCitationSchema = z.array(z.string());
353
+ function getResponseMetadata({
354
+ id,
355
+ model,
356
+ created
357
+ }) {
358
+ return {
359
+ id,
360
+ modelId: model,
361
+ timestamp: new Date(created * 1e3)
362
+ };
363
+ }
364
+ var perplexityUsageSchema = z.object({
365
+ prompt_tokens: z.number(),
366
+ completion_tokens: z.number(),
367
+ citation_tokens: z.number().nullish(),
368
+ num_search_queries: z.number().nullish()
369
+ });
72
370
  var perplexityImageSchema = z.object({
73
371
  image_url: z.string(),
74
372
  origin_url: z.string(),
75
373
  height: z.number(),
76
374
  width: z.number()
77
375
  });
78
- var perplexityUsageSchema = z.object({
79
- citation_tokens: z.number().nullish(),
80
- num_search_queries: z.number().nullish()
81
- });
82
376
  var perplexityResponseSchema = z.object({
83
- citations: perplexityCitationSchema.nullish(),
377
+ id: z.string(),
378
+ created: z.number(),
379
+ model: z.string(),
380
+ choices: z.array(
381
+ z.object({
382
+ message: z.object({
383
+ role: z.literal("assistant"),
384
+ content: z.string()
385
+ }),
386
+ finish_reason: z.string()
387
+ })
388
+ ),
389
+ citations: z.array(z.string()),
84
390
  images: z.array(perplexityImageSchema).nullish(),
85
- usage: perplexityUsageSchema.nullish()
391
+ usage: perplexityUsageSchema
86
392
  });
87
- var perplexityStreamChunkSchema = z.object({
393
+ var perplexityChunkSchema = z.object({
394
+ id: z.string(),
395
+ created: z.number(),
396
+ model: z.string(),
88
397
  choices: z.array(
89
398
  z.object({
90
- finish_reason: z.string().nullish(),
91
399
  delta: z.object({
92
- role: z.string(),
400
+ role: z.literal("assistant"),
93
401
  content: z.string()
94
- }).nullish()
402
+ }),
403
+ finish_reason: z.string().nullish()
95
404
  })
96
- ).nullish(),
97
- citations: perplexityCitationSchema.nullish(),
405
+ ),
406
+ citations: z.array(z.string()).nullish(),
98
407
  images: z.array(perplexityImageSchema).nullish(),
99
408
  usage: perplexityUsageSchema.nullish()
100
409
  });
410
+ var perplexityErrorSchema = z.object({
411
+ code: z.string(),
412
+ error: z.string()
413
+ });
101
414
 
102
415
  // src/perplexity-provider.ts
103
- var perplexityErrorSchema = z2.object({
104
- code: z2.string(),
105
- error: z2.string()
106
- });
107
- var perplexityErrorStructure = {
108
- errorSchema: perplexityErrorSchema,
109
- errorToMessage: (data) => data.error
110
- };
111
416
  function createPerplexity(options = {}) {
112
- var _a;
113
- const baseURL = withoutTrailingSlash(
114
- (_a = options.baseURL) != null ? _a : "https://api.perplexity.ai"
115
- );
116
417
  const getHeaders = () => ({
117
418
  Authorization: `Bearer ${loadApiKey({
118
419
  apiKey: options.apiKey,
@@ -121,21 +422,19 @@ function createPerplexity(options = {}) {
121
422
  })}`,
122
423
  ...options.headers
123
424
  });
124
- const createLanguageModel = (modelId, settings = {}) => {
125
- return new OpenAICompatibleChatLanguageModel(modelId, settings, {
126
- provider: "perplexity.chat",
127
- url: ({ path }) => `${baseURL}${path}`,
425
+ const createLanguageModel = (modelId) => {
426
+ var _a;
427
+ return new PerplexityLanguageModel(modelId, {
428
+ baseURL: withoutTrailingSlash(
429
+ (_a = options.baseURL) != null ? _a : "https://api.perplexity.ai"
430
+ ),
128
431
  headers: getHeaders,
129
- fetch: options.fetch,
130
- defaultObjectGenerationMode: "json",
131
- errorStructure: perplexityErrorStructure,
132
- metadataExtractor: perplexityMetadataExtractor,
133
- supportsStructuredOutputs: true
432
+ generateId,
433
+ fetch: options.fetch
134
434
  });
135
435
  };
136
- const provider = (modelId, settings) => createLanguageModel(modelId, settings);
436
+ const provider = (modelId) => createLanguageModel(modelId);
137
437
  provider.languageModel = createLanguageModel;
138
- provider.chat = createLanguageModel;
139
438
  provider.textEmbeddingModel = (modelId) => {
140
439
  throw new NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
141
440
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/perplexity-provider.ts","../src/perplexity-metadata-extractor.ts"],"sourcesContent":["import {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n PerplexityChatModelId,\n PerplexityChatSettings,\n} from './perplexity-chat-settings';\nimport { z } from 'zod';\nimport { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { perplexityMetadataExtractor } from './perplexity-metadata-extractor';\n\n// Add error schema and structure\nconst perplexityErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;\n\nconst perplexityErrorStructure: ProviderErrorStructure<PerplexityErrorData> = {\n errorSchema: perplexityErrorSchema,\n errorToMessage: data => data.error,\n};\n\nexport interface PerplexityProvider extends ProviderV1 {\n /**\nCreates an Perplexity chat model for text generation.\n */\n (\n modelId: PerplexityChatModelId,\n settings?: PerplexityChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates an Perplexity language model for text generation.\n */\n languageModel(\n modelId: PerplexityChatModelId,\n settings?: PerplexityChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates an Perplexity chat model for text generation.\n */\n chat: (\n modelId: PerplexityChatModelId,\n settings?: PerplexityChatSettings,\n ) => LanguageModelV1;\n}\n\nexport interface PerplexityProviderSettings {\n /**\nBase URL for the perplexity API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor 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 baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.perplexity.ai',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PERPLEXITY_API_KEY',\n description: 'Perplexity',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: PerplexityChatModelId,\n settings: PerplexityChatSettings = {},\n ) => {\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: 'perplexity.chat',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: 'json',\n errorStructure: perplexityErrorStructure,\n metadataExtractor: perplexityMetadataExtractor,\n supportsStructuredOutputs: true,\n });\n };\n\n const provider = (\n modelId: PerplexityChatModelId,\n settings?: PerplexityChatSettings,\n ) => createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const perplexity = createPerplexity();\n","import { MetadataExtractor } from '@ai-sdk/openai-compatible';\nimport { safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nexport const perplexityMetadataExtractor: MetadataExtractor = {\n extractMetadata: ({ parsedBody }: { parsedBody: unknown }) => {\n const parsed = safeValidateTypes({\n value: parsedBody,\n schema: perplexityResponseSchema,\n });\n\n return !parsed.success\n ? undefined\n : buildPerplexityMetadata(\n parsed.value.citations ?? undefined,\n parsed.value.images ?? undefined,\n parsed.value.usage ?? undefined,\n );\n },\n\n createStreamExtractor: () => {\n let citations: string[] | undefined;\n let images: PerplexityImageData[] | undefined;\n let usage: PerplexityUsageData | undefined;\n\n return {\n processChunk: (chunk: unknown) => {\n const parsed = safeValidateTypes({\n value: chunk,\n schema: perplexityStreamChunkSchema,\n });\n\n if (parsed.success) {\n citations = parsed.value.citations ?? citations;\n images = parsed.value.images ?? images;\n usage = parsed.value.usage ?? usage;\n }\n },\n buildMetadata: () => buildPerplexityMetadata(citations, images, usage),\n };\n },\n};\n\nconst buildPerplexityMetadata = (\n citations: string[] | undefined,\n images: PerplexityImageData[] | undefined,\n usage: PerplexityUsageData | undefined,\n) => {\n return citations || images || usage\n ? {\n perplexity: {\n ...(citations && { citations }),\n ...(images && {\n images: images.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n })),\n }),\n ...(usage && {\n usage: {\n citationTokens: usage.citation_tokens ?? NaN,\n numSearchQueries: usage.num_search_queries ?? NaN,\n },\n }),\n },\n }\n : undefined;\n};\n\nconst perplexityCitationSchema = z.array(z.string());\n\nconst perplexityImageSchema = z.object({\n image_url: z.string(),\n origin_url: z.string(),\n height: z.number(),\n width: z.number(),\n});\n\ntype PerplexityImageData = z.infer<typeof perplexityImageSchema>;\n\nconst perplexityUsageSchema = z.object({\n citation_tokens: z.number().nullish(),\n num_search_queries: z.number().nullish(),\n});\n\ntype PerplexityUsageData = z.infer<typeof perplexityUsageSchema>;\n\nconst perplexityResponseSchema = z.object({\n citations: perplexityCitationSchema.nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n\nconst perplexityStreamChunkSchema = z.object({\n choices: z\n .array(\n z.object({\n finish_reason: z.string().nullish(),\n delta: z\n .object({\n role: z.string(),\n content: z.string(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n citations: perplexityCitationSchema.nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n"],"mappings":"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","names":["z","z"]}
1
+ {"version":3,"sources":["../src/perplexity-provider.ts","../src/perplexity-language-model.ts","../src/convert-to-perplexity-messages.ts","../src/map-perplexity-finish-reason.ts"],"sourcesContent":["import {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { PerplexityLanguageModel } from './perplexity-language-model';\nimport { PerplexityLanguageModelId } from './perplexity-language-model-settings';\n\nexport interface PerplexityProvider extends ProviderV1 {\n /**\nCreates an Perplexity chat model for text generation.\n */\n (modelId: PerplexityLanguageModelId): LanguageModelV1;\n\n /**\nCreates an Perplexity language model for text generation.\n */\n languageModel(modelId: PerplexityLanguageModelId): LanguageModelV1;\n}\n\nexport interface PerplexityProviderSettings {\n /**\nBase URL for the perplexity API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor 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 Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PERPLEXITY_API_KEY',\n description: 'Perplexity',\n })}`,\n ...options.headers,\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.languageModel = createLanguageModel;\n\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const perplexity = createPerplexity();\n","import {\n LanguageModelV1,\n LanguageModelV1CallWarning,\n LanguageModelV1FinishReason,\n LanguageModelV1StreamPart,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport { PerplexityLanguageModelId } from './perplexity-language-model-settings';\nimport { convertToPerplexityMessages } from './convert-to-perplexity-messages';\nimport { mapPerplexityFinishReason } from './map-perplexity-finish-reason';\n\ntype PerplexityChatConfig = {\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n generateId: () => string;\n fetch?: FetchFunction;\n};\n\nexport class PerplexityLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = 'v1';\n readonly defaultObjectGenerationMode = 'json';\n readonly supportsStructuredOutputs = true;\n readonly supportsImageUrls = false;\n readonly provider = 'perplexity';\n\n readonly modelId: PerplexityLanguageModelId;\n\n private readonly config: PerplexityChatConfig;\n\n constructor(\n modelId: PerplexityLanguageModelId,\n config: PerplexityChatConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n private getArgs({\n mode,\n prompt,\n maxTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n providerMetadata,\n }: Parameters<LanguageModelV1['doGenerate']>[0]) {\n const type = mode.type;\n\n const warnings: LanguageModelV1CallWarning[] = [];\n\n if (topK != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'topK',\n });\n }\n\n if (stopSequences != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'stopSequences',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'seed',\n });\n }\n\n const baseArgs = {\n // model id:\n model: this.modelId,\n\n // standardized settings:\n frequency_penalty: frequencyPenalty,\n max_tokens: maxTokens,\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 ...(providerMetadata?.perplexity ?? {}),\n\n // messages:\n messages: convertToPerplexityMessages(prompt),\n };\n\n switch (type) {\n case 'regular': {\n return { args: baseArgs, warnings };\n }\n\n case 'object-json': {\n return {\n args: {\n ...baseArgs,\n response_format: {\n type: 'json_schema',\n json_schema: { schema: mode.schema },\n },\n },\n warnings,\n };\n }\n\n case 'object-tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool-mode object generation',\n });\n }\n\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Unsupported type: ${_exhaustiveCheck}`);\n }\n }\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV1['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1['doGenerate']>>> {\n const { args, warnings } = this.getArgs(options);\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: args,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: perplexityErrorSchema,\n errorToMessage: data => data.error,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n perplexityResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { messages: rawPrompt, ...rawSettings } = args;\n const choice = response.choices[0];\n const text = choice.message.content;\n\n return {\n text,\n toolCalls: [],\n finishReason: mapPerplexityFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n },\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n request: { body: JSON.stringify(args) },\n response: getResponseMetadata(response),\n warnings,\n sources: response.citations.map(url => ({\n sourceType: 'url',\n id: this.config.generateId(),\n url,\n })),\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 },\n },\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV1['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1['doStream']>>> {\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: data => data.error,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(\n perplexityChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { messages: rawPrompt, ...rawSettings } = args;\n\n let finishReason: LanguageModelV1FinishReason = 'unknown';\n let usage: { promptTokens: number; completionTokens: number } = {\n promptTokens: Number.NaN,\n completionTokens: Number.NaN,\n };\n const providerMetadata: {\n perplexity: {\n usage: {\n citationTokens: number | null;\n numSearchQueries: number | null;\n };\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 images: null,\n },\n };\n let isFirstChunk = true;\n\n const self = this;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof perplexityChunkSchema>>,\n LanguageModelV1StreamPart\n >({\n transform(chunk, controller) {\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 source: {\n sourceType: 'url',\n id: self.config.generateId(),\n url,\n },\n });\n });\n\n isFirstChunk = false;\n }\n\n if (value.usage != null) {\n usage = {\n promptTokens: value.usage.prompt_tokens,\n completionTokens: value.usage.completion_tokens,\n };\n\n providerMetadata.perplexity.usage = {\n citationTokens: value.usage.citation_tokens ?? null,\n numSearchQueries: value.usage.num_search_queries ?? null,\n };\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 = mapPerplexityFinishReason(choice.finish_reason);\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 controller.enqueue({\n type: 'text-delta',\n textDelta: textContent,\n });\n }\n },\n\n flush(controller) {\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n providerMetadata,\n });\n },\n }),\n ),\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n request: { body: JSON.stringify(body) },\n warnings,\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 perplexityUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n citation_tokens: z.number().nullish(),\n num_search_queries: z.number().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(),\n }),\n ),\n citations: z.array(z.string()),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema,\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'),\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\nexport const perplexityErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;\n","import {\n LanguageModelV1Prompt,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport { PerplexityPrompt } from './perplexity-language-model-prompt';\n\nexport function convertToPerplexityMessages(\n prompt: LanguageModelV1Prompt,\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 messages.push({\n role,\n content: content\n .map(part => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n case 'image': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Image content parts in user messages',\n });\n }\n case 'file': {\n throw new UnsupportedFunctionalityError({\n functionality: 'File content parts in user messages',\n });\n }\n case 'tool-call': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Tool calls in assistant messages',\n });\n }\n default: {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n })\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 { LanguageModelV1FinishReason } from '@ai-sdk/provider';\n\nexport function mapPerplexityFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV1FinishReason {\n switch (finishReason) {\n case 'stop':\n case 'length':\n return finishReason;\n default:\n return 'unknown';\n }\n}\n"],"mappings":"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","names":["UnsupportedFunctionalityError","UnsupportedFunctionalityError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/perplexity",
3
- "version": "0.0.8",
3
+ "version": "1.0.0",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -19,9 +19,8 @@
19
19
  }
20
20
  },
21
21
  "dependencies": {
22
- "@ai-sdk/openai-compatible": "0.1.9",
23
22
  "@ai-sdk/provider": "1.0.7",
24
- "@ai-sdk/provider-utils": "2.1.7"
23
+ "@ai-sdk/provider-utils": "2.1.8"
25
24
  },
26
25
  "devDependencies": {
27
26
  "@types/node": "^18",