@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 +11 -0
- package/dist/index.d.mts +4 -23
- package/dist/index.d.ts +4 -23
- package/dist/index.js +377 -89
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +387 -88
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -3
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
|
|
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:
|
|
10
|
+
(modelId: PerplexityLanguageModelId): LanguageModelV1;
|
|
26
11
|
/**
|
|
27
12
|
Creates an Perplexity language model for text generation.
|
|
28
13
|
*/
|
|
29
|
-
languageModel(modelId:
|
|
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
|
|
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
|
|
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:
|
|
10
|
+
(modelId: PerplexityLanguageModelId): LanguageModelV1;
|
|
26
11
|
/**
|
|
27
12
|
Creates an Perplexity language model for text generation.
|
|
28
13
|
*/
|
|
29
|
-
languageModel(modelId:
|
|
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
|
|
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
|
|
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-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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:
|
|
87
|
-
numSearchQueries:
|
|
88
|
-
}
|
|
278
|
+
citationTokens: null,
|
|
279
|
+
numSearchQueries: null
|
|
280
|
+
},
|
|
281
|
+
images: null
|
|
89
282
|
}
|
|
90
|
-
}
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
402
|
+
usage: perplexityUsageSchema
|
|
108
403
|
});
|
|
109
|
-
var
|
|
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.
|
|
411
|
+
role: import_zod.z.literal("assistant"),
|
|
115
412
|
content: import_zod.z.string()
|
|
116
|
-
})
|
|
413
|
+
}),
|
|
414
|
+
finish_reason: import_zod.z.string().nullish()
|
|
117
415
|
})
|
|
118
|
-
)
|
|
119
|
-
citations:
|
|
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
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
152
|
-
|
|
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
|
|
447
|
+
const provider = (modelId) => createLanguageModel(modelId);
|
|
159
448
|
provider.languageModel = createLanguageModel;
|
|
160
|
-
provider.chat = createLanguageModel;
|
|
161
449
|
provider.textEmbeddingModel = (modelId) => {
|
|
162
|
-
throw new
|
|
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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAIO;AACP,+BAAkD;AAClD,IAAAA,yBAIO;AAKP,IAAAC,cAAkB;;;ACdlB,4BAAkC;AAClC,iBAAkB;AAEX,IAAM,8BAAiD;AAAA,EAC5D,iBAAiB,CAAC,EAAE,WAAW,MAA+B;AALhE;AAMI,UAAM,aAAS,yCAAkB;AAAA,MAC/B,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,CAAC,OAAO,UACX,SACA;AAAA,OACE,YAAO,MAAM,cAAb,YAA0B;AAAA,OAC1B,YAAO,MAAM,WAAb,YAAuB;AAAA,OACvB,YAAO,MAAM,UAAb,YAAsB;AAAA,IACxB;AAAA,EACN;AAAA,EAEA,uBAAuB,MAAM;AAC3B,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,WAAO;AAAA,MACL,cAAc,CAAC,UAAmB;AA1BxC;AA2BQ,cAAM,aAAS,yCAAkB;AAAA,UAC/B,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAED,YAAI,OAAO,SAAS;AAClB,uBAAY,YAAO,MAAM,cAAb,YAA0B;AACtC,oBAAS,YAAO,MAAM,WAAb,YAAuB;AAChC,mBAAQ,YAAO,MAAM,UAAb,YAAsB;AAAA,QAChC;AAAA,MACF;AAAA,MACA,eAAe,MAAM,wBAAwB,WAAW,QAAQ,KAAK;AAAA,IACvE;AAAA,EACF;AACF;AAEA,IAAM,0BAA0B,CAC9B,WACA,QACA,UACG;AA/CL;AAgDE,SAAO,aAAa,UAAU,QAC1B;AAAA,IACE,YAAY;AAAA,MACV,GAAI,aAAa,EAAE,UAAU;AAAA,MAC7B,GAAI,UAAU;AAAA,QACZ,QAAQ,OAAO,IAAI,YAAU;AAAA,UAC3B,UAAU,MAAM;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,QAAQ,MAAM;AAAA,UACd,OAAO,MAAM;AAAA,QACf,EAAE;AAAA,MACJ;AAAA,MACA,GAAI,SAAS;AAAA,QACX,OAAO;AAAA,UACL,iBAAgB,WAAM,oBAAN,YAAyB;AAAA,UACzC,mBAAkB,WAAM,uBAAN,YAA4B;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAAA,EACF,IACA;AACN;AAEA,IAAM,2BAA2B,aAAE,MAAM,aAAE,OAAO,CAAC;AAEnD,IAAM,wBAAwB,aAAE,OAAO;AAAA,EACrC,WAAW,aAAE,OAAO;AAAA,EACpB,YAAY,aAAE,OAAO;AAAA,EACrB,QAAQ,aAAE,OAAO;AAAA,EACjB,OAAO,aAAE,OAAO;AAClB,CAAC;AAID,IAAM,wBAAwB,aAAE,OAAO;AAAA,EACrC,iBAAiB,aAAE,OAAO,EAAE,QAAQ;AAAA,EACpC,oBAAoB,aAAE,OAAO,EAAE,QAAQ;AACzC,CAAC;AAID,IAAM,2BAA2B,aAAE,OAAO;AAAA,EACxC,WAAW,yBAAyB,QAAQ;AAAA,EAC5C,QAAQ,aAAE,MAAM,qBAAqB,EAAE,QAAQ;AAAA,EAC/C,OAAO,sBAAsB,QAAQ;AACvC,CAAC;AAED,IAAM,8BAA8B,aAAE,OAAO;AAAA,EAC3C,SAAS,aACN;AAAA,IACC,aAAE,OAAO;AAAA,MACP,eAAe,aAAE,OAAO,EAAE,QAAQ;AAAA,MAClC,OAAO,aACJ,OAAO;AAAA,QACN,MAAM,aAAE,OAAO;AAAA,QACf,SAAS,aAAE,OAAO;AAAA,MACpB,CAAC,EACA,QAAQ;AAAA,IACb,CAAC;AAAA,EACH,EACC,QAAQ;AAAA,EACX,WAAW,yBAAyB,QAAQ;AAAA,EAC5C,QAAQ,aAAE,MAAM,qBAAqB,EAAE,QAAQ;AAAA,EAC/C,OAAO,sBAAsB,QAAQ;AACvC,CAAC;;;AD5FD,IAAM,wBAAwB,cAAE,OAAO;AAAA,EACrC,MAAM,cAAE,OAAO;AAAA,EACf,OAAO,cAAE,OAAO;AAClB,CAAC;AAID,IAAM,2BAAwE;AAAA,EAC5E,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B;AAmDO,SAAS,iBACd,UAAsC,CAAC,GACnB;AAnFtB;AAoFE,QAAM,cAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,cAAU,mCAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,sBAAsB,CAC1B,SACA,WAAmC,CAAC,MACjC;AACH,WAAO,IAAI,2DAAkC,SAAS,UAAU;AAAA,MAC9D,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,6BAA6B;AAAA,MAC7B,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CACf,SACA,aACG,oBAAoB,SAAS,QAAQ;AAE1C,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,IAAM,aAAa,iBAAiB;","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-
|
|
13
|
-
import {
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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:
|
|
65
|
-
numSearchQueries:
|
|
66
|
-
}
|
|
267
|
+
citationTokens: null,
|
|
268
|
+
numSearchQueries: null
|
|
269
|
+
},
|
|
270
|
+
images: null
|
|
67
271
|
}
|
|
68
|
-
}
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
391
|
+
usage: perplexityUsageSchema
|
|
86
392
|
});
|
|
87
|
-
var
|
|
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.
|
|
400
|
+
role: z.literal("assistant"),
|
|
93
401
|
content: z.string()
|
|
94
|
-
})
|
|
402
|
+
}),
|
|
403
|
+
finish_reason: z.string().nullish()
|
|
95
404
|
})
|
|
96
|
-
)
|
|
97
|
-
citations:
|
|
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
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
errorStructure: perplexityErrorStructure,
|
|
132
|
-
metadataExtractor: perplexityMetadataExtractor,
|
|
133
|
-
supportsStructuredOutputs: true
|
|
432
|
+
generateId,
|
|
433
|
+
fetch: options.fetch
|
|
134
434
|
});
|
|
135
435
|
};
|
|
136
|
-
const provider = (modelId
|
|
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
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -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":";AAAA;AAAA,EAEE;AAAA,OAEK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACVP;AAAA,EAKE,iCAAAA;AAAA,OACK;AACP;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;;;AChBlB;AAAA,EAEE;AAAA,OACK;AAGA,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,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,SAAS,QACN,IAAI,UAAQ;AACX,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK,QAAQ;AACX,uBAAO,KAAK;AAAA,cACd;AAAA,cACA,KAAK,SAAS;AACZ,sBAAM,IAAI,8BAA8B;AAAA,kBACtC,eAAe;AAAA,gBACjB,CAAC;AAAA,cACH;AAAA,cACA,KAAK,QAAQ;AACX,sBAAM,IAAI,8BAA8B;AAAA,kBACtC,eAAe;AAAA,gBACjB,CAAC;AAAA,cACH;AAAA,cACA,KAAK,aAAa;AAChB,sBAAM,IAAI,8BAA8B;AAAA,kBACtC,eAAe;AAAA,gBACjB,CAAC;AAAA,cACH;AAAA,cACA,SAAS;AACP,sBAAM,mBAA0B;AAChC,sBAAM,IAAI,MAAM,qBAAqB,gBAAgB,EAAE;AAAA,cACzD;AAAA,YACF;AAAA,UACF,CAAC,EACA,KAAK,EAAE;AAAA,QACZ,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;;;AChEO,SAAS,0BACd,cAC6B;AAC7B,UAAQ,cAAc;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AFgBO,IAAM,0BAAN,MAAyD;AAAA,EAW9D,YACE,SACA,QACA;AAbF,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAC7B,SAAS,WAAW;AAUlB,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,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,GAAiD;AA5DnD;AA6DI,UAAM,OAAO,KAAK;AAElB,UAAM,WAAyC,CAAC;AAEhD,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,iBAAiB,MAAM;AACzB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,WAAW;AAAA;AAAA,MAEf,OAAO,KAAK;AAAA;AAAA,MAGZ,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA;AAAA,MAGP,kBACE,iDAAgB,UAAS,SACrB;AAAA,QACE,MAAM;AAAA,QACN,aAAa,EAAE,QAAQ,eAAe,OAAO;AAAA,MAC/C,IACA;AAAA;AAAA,MAGN,IAAI,0DAAkB,eAAlB,YAAgC,CAAC;AAAA;AAAA,MAGrC,UAAU,4BAA4B,MAAM;AAAA,IAC9C;AAEA,YAAQ,MAAM;AAAA,MACZ,KAAK,WAAW;AACd,eAAO,EAAE,MAAM,UAAU,SAAS;AAAA,MACpC;AAAA,MAEA,KAAK,eAAe;AAClB,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,GAAG;AAAA,YACH,iBAAiB;AAAA,cACf,MAAM;AAAA,cACN,aAAa,EAAE,QAAQ,KAAK,OAAO;AAAA,YACrC;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,cAAM,IAAIC,+BAA8B;AAAA,UACtC,eAAe;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,MAEA,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,MAAM,qBAAqB,gBAAgB,EAAE;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SAC6D;AAnJjE;AAoJI,UAAM,EAAE,MAAM,SAAS,IAAI,KAAK,QAAQ,OAAO;AAE/C,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,MAAM,cAAc;AAAA,MAC/D,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,eAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D,MAAM;AAAA,MACN,uBAAuB,+BAA+B;AAAA,QACpD,aAAa;AAAA,QACb,gBAAgB,UAAQ,KAAK;AAAA,MAC/B,CAAC;AAAA,MACD,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,EAAE,UAAU,WAAW,GAAG,YAAY,IAAI;AAChD,UAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,UAAM,OAAO,OAAO,QAAQ;AAE5B,WAAO;AAAA,MACL;AAAA,MACA,WAAW,CAAC;AAAA,MACZ,cAAc,0BAA0B,OAAO,aAAa;AAAA,MAC5D,OAAO;AAAA,QACL,cAAc,SAAS,MAAM;AAAA,QAC7B,kBAAkB,SAAS,MAAM;AAAA,MACnC;AAAA,MACA,SAAS,EAAE,WAAW,YAAY;AAAA,MAClC,aAAa,EAAE,SAAS,gBAAgB;AAAA,MACxC,SAAS,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,MACtC,UAAU,oBAAoB,QAAQ;AAAA,MACtC;AAAA,MACA,SAAS,SAAS,UAAU,IAAI,UAAQ;AAAA,QACtC,YAAY;AAAA,QACZ,IAAI,KAAK,OAAO,WAAW;AAAA,QAC3B;AAAA,MACF,EAAE;AAAA,MACF,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,cAAS,MAAM,oBAAf,YAAkC;AAAA,YAClD,mBAAkB,cAAS,MAAM,uBAAf,YAAqC;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SAC2D;AAC3D,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,eAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D;AAAA,MACA,uBAAuB,+BAA+B;AAAA,QACpD,aAAa;AAAA,QACb,gBAAgB,UAAQ,KAAK;AAAA,MAC/B,CAAC;AAAA,MACD,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,EAAE,UAAU,WAAW,GAAG,YAAY,IAAI;AAEhD,QAAI,eAA4C;AAChD,QAAI,QAA4D;AAAA,MAC9D,cAAc,OAAO;AAAA,MACrB,kBAAkB,OAAO;AAAA,IAC3B;AACA,UAAM,mBAaF;AAAA,MACF,YAAY;AAAA,QACV,OAAO;AAAA,UACL,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AACA,QAAI,eAAe;AAEnB,UAAM,OAAO;AAEb,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,QACf,IAAI,gBAGF;AAAA,UACA,UAAU,OAAO,YAAY;AA1QvC;AA2QY,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,0BAAM,cAAN,mBAAiB,QAAQ,SAAO;AAC9B,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,QAAQ;AAAA,oBACN,YAAY;AAAA,oBACZ,IAAI,KAAK,OAAO,WAAW;AAAA,oBAC3B;AAAA,kBACF;AAAA,gBACF,CAAC;AAAA,cACH;AAEA,6BAAe;AAAA,YACjB;AAEA,gBAAI,MAAM,SAAS,MAAM;AACvB,sBAAQ;AAAA,gBACN,cAAc,MAAM,MAAM;AAAA,gBAC1B,kBAAkB,MAAM,MAAM;AAAA,cAChC;AAEA,+BAAiB,WAAW,QAAQ;AAAA,gBAClC,iBAAgB,WAAM,MAAM,oBAAZ,YAA+B;AAAA,gBAC/C,mBAAkB,WAAM,MAAM,uBAAZ,YAAkC;AAAA,cACtD;AAAA,YACF;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,0BAA0B,OAAO,aAAa;AAAA,YAC/D;AAEA,iBAAI,iCAAQ,UAAS,MAAM;AACzB;AAAA,YACF;AAEA,kBAAM,QAAQ,OAAO;AACrB,kBAAM,cAAc,MAAM;AAE1B,gBAAI,eAAe,MAAM;AACvB,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,WAAW;AAAA,cACb,CAAC;AAAA,YACH;AAAA,UACF;AAAA,UAEA,MAAM,YAAY;AAChB,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,SAAS,EAAE,WAAW,YAAY;AAAA,MAClC,aAAa,EAAE,SAAS,gBAAgB;AAAA,MACxC,SAAS,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,MACtC;AAAA,IACF;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,wBAAwB,EAAE,OAAO;AAAA,EACrC,eAAe,EAAE,OAAO;AAAA,EACxB,mBAAmB,EAAE,OAAO;AAAA,EAC5B,iBAAiB,EAAE,OAAO,EAAE,QAAQ;AAAA,EACpC,oBAAoB,EAAE,OAAO,EAAE,QAAQ;AACzC,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;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EACA,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC7B,QAAQ,EAAE,MAAM,qBAAqB,EAAE,QAAQ;AAAA,EAC/C,OAAO;AACT,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;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;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,OAAO;AAClB,CAAC;;;ADzXM,SAAS,iBACd,UAAsC,CAAC,GACnB;AACpB,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,UAAU,WAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,sBAAsB,CAAC,YAAuC;AA7DtE;AA8DI,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,gBAAgB;AAEzB,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,IAAM,aAAa,iBAAiB;","names":["UnsupportedFunctionalityError","UnsupportedFunctionalityError"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/perplexity",
|
|
3
|
-
"version": "0.0
|
|
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.
|
|
23
|
+
"@ai-sdk/provider-utils": "2.1.8"
|
|
25
24
|
},
|
|
26
25
|
"devDependencies": {
|
|
27
26
|
"@types/node": "^18",
|