@ai-sdk/perplexity 3.0.62 → 3.1.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 +22 -0
- package/README.md +18 -9
- package/dist/index.d.mts +112 -5
- package/dist/index.d.ts +112 -5
- package/dist/index.js +996 -341
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1000 -345
- package/dist/index.mjs.map +1 -1
- package/docs/70-perplexity.mdx +229 -70
- package/package.json +3 -3
- package/src/convert-perplexity-usage.ts +29 -15
- package/src/convert-to-perplexity-input.ts +199 -0
- package/src/index.ts +5 -0
- package/src/map-perplexity-finish-reason.ts +27 -8
- package/src/perplexity-agent-api.ts +206 -0
- package/src/perplexity-embedding-model.ts +5 -2
- package/src/perplexity-language-model-options.ts +124 -8
- package/src/perplexity-language-model-prompt.ts +25 -18
- package/src/perplexity-language-model.ts +653 -305
- package/src/perplexity-options.ts +11 -0
- package/src/perplexity-prepare-tools.ts +48 -0
- package/src/perplexity-provider.ts +4 -4
- package/src/convert-to-perplexity-messages.ts +0 -174
package/dist/index.js
CHANGED
|
@@ -27,13 +27,13 @@ __export(index_exports, {
|
|
|
27
27
|
module.exports = __toCommonJS(index_exports);
|
|
28
28
|
|
|
29
29
|
// src/perplexity-provider.ts
|
|
30
|
-
var
|
|
30
|
+
var import_provider4 = require("@ai-sdk/provider");
|
|
31
31
|
var import_provider_utils4 = require("@ai-sdk/provider-utils");
|
|
32
32
|
|
|
33
33
|
// src/perplexity-embedding-model.ts
|
|
34
|
-
var
|
|
34
|
+
var import_provider3 = require("@ai-sdk/provider");
|
|
35
35
|
var import_provider_utils3 = require("@ai-sdk/provider-utils");
|
|
36
|
-
var
|
|
36
|
+
var import_v44 = require("zod/v4");
|
|
37
37
|
|
|
38
38
|
// src/perplexity-embedding-model-options.ts
|
|
39
39
|
var import_v4 = require("zod/v4");
|
|
@@ -54,12 +54,12 @@ var perplexityEmbeddingModelOptions = import_v4.z.object({
|
|
|
54
54
|
});
|
|
55
55
|
|
|
56
56
|
// src/perplexity-language-model.ts
|
|
57
|
+
var import_provider2 = require("@ai-sdk/provider");
|
|
57
58
|
var import_provider_utils2 = require("@ai-sdk/provider-utils");
|
|
58
|
-
var import_v42 = require("zod/v4");
|
|
59
59
|
|
|
60
60
|
// src/convert-perplexity-usage.ts
|
|
61
61
|
function convertPerplexityUsage(usage) {
|
|
62
|
-
var _a, _b, _c;
|
|
62
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
63
63
|
if (usage == null) {
|
|
64
64
|
return {
|
|
65
65
|
inputTokens: {
|
|
@@ -76,101 +76,174 @@ function convertPerplexityUsage(usage) {
|
|
|
76
76
|
raw: void 0
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
const
|
|
79
|
+
const inputTokens = (_a = usage.input_tokens) != null ? _a : 0;
|
|
80
|
+
const outputTokens = (_b = usage.output_tokens) != null ? _b : 0;
|
|
81
|
+
const cacheReadTokens = (_f = (_e = (_c = usage.input_tokens_details) == null ? void 0 : _c.cache_read_input_tokens) != null ? _e : (_d = usage.input_tokens_details) == null ? void 0 : _d.cached_tokens) != null ? _f : 0;
|
|
82
|
+
const cacheWriteTokens = (_h = (_g = usage.input_tokens_details) == null ? void 0 : _g.cache_creation_input_tokens) != null ? _h : 0;
|
|
83
|
+
const reasoningTokens = (_j = (_i = usage.output_tokens_details) == null ? void 0 : _i.reasoning_tokens) != null ? _j : 0;
|
|
82
84
|
return {
|
|
83
85
|
inputTokens: {
|
|
84
|
-
total:
|
|
85
|
-
noCache:
|
|
86
|
-
cacheRead:
|
|
87
|
-
cacheWrite:
|
|
86
|
+
total: inputTokens,
|
|
87
|
+
noCache: Math.max(0, inputTokens - cacheReadTokens - cacheWriteTokens),
|
|
88
|
+
cacheRead: cacheReadTokens,
|
|
89
|
+
cacheWrite: cacheWriteTokens
|
|
88
90
|
},
|
|
89
91
|
outputTokens: {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
text: completionTokens,
|
|
92
|
+
total: outputTokens,
|
|
93
|
+
text: Math.max(0, outputTokens - reasoningTokens),
|
|
93
94
|
reasoning: reasoningTokens
|
|
94
95
|
},
|
|
95
96
|
raw: usage
|
|
96
97
|
};
|
|
97
98
|
}
|
|
98
99
|
|
|
99
|
-
// src/convert-to-perplexity-
|
|
100
|
+
// src/convert-to-perplexity-input.ts
|
|
100
101
|
var import_provider = require("@ai-sdk/provider");
|
|
101
102
|
var import_provider_utils = require("@ai-sdk/provider-utils");
|
|
102
|
-
function
|
|
103
|
-
|
|
103
|
+
function serializeToolOutput(output) {
|
|
104
|
+
var _a;
|
|
105
|
+
switch (output.type) {
|
|
106
|
+
case "text":
|
|
107
|
+
case "error-text":
|
|
108
|
+
return output.value;
|
|
109
|
+
case "json":
|
|
110
|
+
case "error-json":
|
|
111
|
+
return JSON.stringify(output.value);
|
|
112
|
+
case "execution-denied":
|
|
113
|
+
return (_a = output.reason) != null ? _a : "Tool call execution denied.";
|
|
114
|
+
case "content": {
|
|
115
|
+
if (output.value.some((part) => part.type !== "text")) {
|
|
116
|
+
throw new import_provider.UnsupportedFunctionalityError({
|
|
117
|
+
functionality: "file and custom tool result content"
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return output.value.map((part) => part.type === "text" ? part.text : "").join("");
|
|
121
|
+
}
|
|
122
|
+
default: {
|
|
123
|
+
const _exhaustiveCheck = output;
|
|
124
|
+
throw new Error(`Unsupported tool output: ${_exhaustiveCheck}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function getTopLevelMediaType(mediaType) {
|
|
129
|
+
const slashIndex = mediaType.indexOf("/");
|
|
130
|
+
return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);
|
|
131
|
+
}
|
|
132
|
+
function getThoughtSignature(providerOptions) {
|
|
133
|
+
var _a;
|
|
134
|
+
const thoughtSignature = (_a = providerOptions == null ? void 0 : providerOptions.perplexity) == null ? void 0 : _a.thoughtSignature;
|
|
135
|
+
return typeof thoughtSignature === "string" ? thoughtSignature : void 0;
|
|
136
|
+
}
|
|
137
|
+
function convertToPerplexityInput(prompt) {
|
|
138
|
+
var _a;
|
|
139
|
+
const input = [];
|
|
140
|
+
const warnings = [];
|
|
104
141
|
for (const { role, content } of prompt) {
|
|
105
142
|
switch (role) {
|
|
106
143
|
case "system": {
|
|
107
|
-
|
|
144
|
+
input.push({ type: "message", role: "system", content });
|
|
108
145
|
break;
|
|
109
146
|
}
|
|
110
|
-
case "user":
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
case "text": {
|
|
119
|
-
return {
|
|
120
|
-
type: "text",
|
|
121
|
-
text: part.text
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
case "file": {
|
|
125
|
-
if (getTopLevelMediaType(part.mediaType) === "application") {
|
|
126
|
-
const fullMediaType = resolveApplicationMediaType(part);
|
|
127
|
-
if (fullMediaType !== "application/pdf") {
|
|
147
|
+
case "user": {
|
|
148
|
+
const convertedContent = content.map(
|
|
149
|
+
(part) => {
|
|
150
|
+
switch (part.type) {
|
|
151
|
+
case "text":
|
|
152
|
+
return { type: "input_text", text: part.text };
|
|
153
|
+
case "file": {
|
|
154
|
+
if (getTopLevelMediaType(part.mediaType) !== "image") {
|
|
128
155
|
throw new import_provider.UnsupportedFunctionalityError({
|
|
129
|
-
functionality: `file part media type ${
|
|
156
|
+
functionality: `file part media type ${part.mediaType}`
|
|
130
157
|
});
|
|
131
158
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
},
|
|
143
|
-
file_name: part.filename || `document-${index}.pdf`
|
|
144
|
-
};
|
|
145
|
-
} else if (part.mediaType.startsWith("image/")) {
|
|
146
|
-
return part.data instanceof URL ? {
|
|
147
|
-
type: "image_url",
|
|
148
|
-
image_url: {
|
|
149
|
-
url: part.data.toString()
|
|
150
|
-
}
|
|
151
|
-
} : {
|
|
152
|
-
type: "image_url",
|
|
153
|
-
image_url: {
|
|
154
|
-
url: `data:${(_a = part.mediaType) != null ? _a : "image/jpeg"};base64,${typeof part.data === "string" ? part.data : (0, import_provider_utils.convertUint8ArrayToBase64)(part.data)}`
|
|
155
|
-
}
|
|
159
|
+
if (part.data instanceof URL) {
|
|
160
|
+
return {
|
|
161
|
+
type: "input_image",
|
|
162
|
+
image_url: part.data.toString()
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const mediaType = part.mediaType === "image/*" ? "image/jpeg" : part.mediaType;
|
|
166
|
+
return {
|
|
167
|
+
type: "input_image",
|
|
168
|
+
image_url: `data:${mediaType};base64,${typeof part.data === "string" ? part.data : (0, import_provider_utils.convertUint8ArrayToBase64)(part.data)}`
|
|
156
169
|
};
|
|
157
170
|
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
);
|
|
174
|
+
const isTextOnly = convertedContent.every(
|
|
175
|
+
(part) => part.type === "input_text"
|
|
176
|
+
);
|
|
177
|
+
input.push({
|
|
178
|
+
type: "message",
|
|
179
|
+
role: "user",
|
|
180
|
+
content: isTextOnly ? convertedContent.map((part) => part.type === "input_text" ? part.text : "").join("") : convertedContent
|
|
181
|
+
});
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case "assistant": {
|
|
185
|
+
const text = content.filter((part) => part.type === "text").map((part) => part.text).join("");
|
|
186
|
+
if (text.length > 0) {
|
|
187
|
+
input.push({ type: "message", role: "assistant", content: text });
|
|
188
|
+
}
|
|
189
|
+
for (const part of content) {
|
|
190
|
+
switch (part.type) {
|
|
191
|
+
case "text":
|
|
192
|
+
break;
|
|
193
|
+
case "tool-call":
|
|
194
|
+
input.push({
|
|
195
|
+
type: "function_call",
|
|
196
|
+
call_id: part.toolCallId,
|
|
197
|
+
name: part.toolName,
|
|
198
|
+
arguments: JSON.stringify((_a = part.input) != null ? _a : {}),
|
|
199
|
+
thought_signature: getThoughtSignature(part.providerOptions)
|
|
200
|
+
});
|
|
201
|
+
break;
|
|
202
|
+
case "tool-result":
|
|
203
|
+
input.push({
|
|
204
|
+
type: "function_call_output",
|
|
205
|
+
call_id: part.toolCallId,
|
|
206
|
+
name: part.toolName,
|
|
207
|
+
output: serializeToolOutput(part.output),
|
|
208
|
+
thought_signature: getThoughtSignature(part.providerOptions)
|
|
209
|
+
});
|
|
210
|
+
break;
|
|
211
|
+
case "reasoning":
|
|
212
|
+
warnings.push({
|
|
213
|
+
type: "unsupported",
|
|
214
|
+
feature: "reasoning content in prompt"
|
|
215
|
+
});
|
|
216
|
+
break;
|
|
217
|
+
case "file":
|
|
158
218
|
throw new import_provider.UnsupportedFunctionalityError({
|
|
159
|
-
functionality: `
|
|
219
|
+
functionality: `assistant ${part.type} parts`
|
|
160
220
|
});
|
|
221
|
+
default: {
|
|
222
|
+
const _exhaustiveCheck = part;
|
|
223
|
+
throw new Error(
|
|
224
|
+
`Unsupported assistant part: ${_exhaustiveCheck}`
|
|
225
|
+
);
|
|
161
226
|
}
|
|
162
227
|
}
|
|
163
|
-
}
|
|
164
|
-
messages.push({
|
|
165
|
-
role,
|
|
166
|
-
content: hasMultipartContent ? messageContent : messageContent.filter((part) => part.type === "text").map((part) => part.text).join("")
|
|
167
|
-
});
|
|
228
|
+
}
|
|
168
229
|
break;
|
|
169
230
|
}
|
|
170
231
|
case "tool": {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
232
|
+
for (const part of content) {
|
|
233
|
+
if (part.type === "tool-approval-response") {
|
|
234
|
+
throw new import_provider.UnsupportedFunctionalityError({
|
|
235
|
+
functionality: "tool approval responses"
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
input.push({
|
|
239
|
+
type: "function_call_output",
|
|
240
|
+
call_id: part.toolCallId,
|
|
241
|
+
name: part.toolName,
|
|
242
|
+
output: serializeToolOutput(part.output),
|
|
243
|
+
thought_signature: getThoughtSignature(part.providerOptions)
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
174
247
|
}
|
|
175
248
|
default: {
|
|
176
249
|
const _exhaustiveCheck = role;
|
|
@@ -178,64 +251,438 @@ function convertToPerplexityMessages(prompt) {
|
|
|
178
251
|
}
|
|
179
252
|
}
|
|
180
253
|
}
|
|
181
|
-
return
|
|
182
|
-
}
|
|
183
|
-
function getTopLevelMediaType(mediaType) {
|
|
184
|
-
const slashIndex = mediaType.indexOf("/");
|
|
185
|
-
return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);
|
|
254
|
+
return { input, warnings };
|
|
186
255
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
256
|
+
|
|
257
|
+
// src/map-perplexity-finish-reason.ts
|
|
258
|
+
function mapPerplexityFinishReason({
|
|
259
|
+
status,
|
|
260
|
+
incompleteReason,
|
|
261
|
+
hasFunctionCall
|
|
262
|
+
}) {
|
|
263
|
+
switch (incompleteReason) {
|
|
264
|
+
case "max_output_tokens":
|
|
265
|
+
return "length";
|
|
266
|
+
case "content_filter":
|
|
267
|
+
return "content-filter";
|
|
268
|
+
}
|
|
269
|
+
switch (status) {
|
|
270
|
+
case "completed":
|
|
271
|
+
return hasFunctionCall ? "tool-calls" : "stop";
|
|
272
|
+
case "requires_action":
|
|
273
|
+
return "tool-calls";
|
|
274
|
+
case "failed":
|
|
275
|
+
return "error";
|
|
276
|
+
case "cancelled":
|
|
277
|
+
case "queued":
|
|
278
|
+
case "in_progress":
|
|
279
|
+
default:
|
|
280
|
+
return hasFunctionCall ? "tool-calls" : "other";
|
|
191
281
|
}
|
|
192
|
-
const subtype = mediaType.substring(slashIndex + 1);
|
|
193
|
-
return subtype.length > 0 && subtype !== "*";
|
|
194
282
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
283
|
+
|
|
284
|
+
// src/perplexity-agent-api.ts
|
|
285
|
+
var import_v42 = require("zod/v4");
|
|
286
|
+
var perplexitySearchResultSchema = import_v42.z.looseObject({
|
|
287
|
+
id: import_v42.z.number().optional(),
|
|
288
|
+
title: import_v42.z.string(),
|
|
289
|
+
url: import_v42.z.string(),
|
|
290
|
+
snippet: import_v42.z.string().optional(),
|
|
291
|
+
date: import_v42.z.string().nullish(),
|
|
292
|
+
last_updated: import_v42.z.string().nullish(),
|
|
293
|
+
source: import_v42.z.string().optional()
|
|
294
|
+
});
|
|
295
|
+
var perplexityFetchedContentSchema = import_v42.z.looseObject({
|
|
296
|
+
title: import_v42.z.string(),
|
|
297
|
+
url: import_v42.z.string(),
|
|
298
|
+
snippet: import_v42.z.string().optional()
|
|
299
|
+
});
|
|
300
|
+
var perplexityContentPartSchema = import_v42.z.looseObject({
|
|
301
|
+
type: import_v42.z.string(),
|
|
302
|
+
text: import_v42.z.string().optional(),
|
|
303
|
+
annotations: import_v42.z.array(
|
|
304
|
+
import_v42.z.looseObject({
|
|
305
|
+
type: import_v42.z.string().optional(),
|
|
306
|
+
url: import_v42.z.string().optional(),
|
|
307
|
+
title: import_v42.z.string().optional()
|
|
308
|
+
})
|
|
309
|
+
).nullish()
|
|
310
|
+
});
|
|
311
|
+
var handledOutputTypes = [
|
|
312
|
+
"message",
|
|
313
|
+
"search_results",
|
|
314
|
+
"fetch_url_results",
|
|
315
|
+
"function_call"
|
|
316
|
+
];
|
|
317
|
+
var perplexityOutputItemSchema = import_v42.z.union([
|
|
318
|
+
import_v42.z.looseObject({
|
|
319
|
+
type: import_v42.z.literal("message"),
|
|
320
|
+
id: import_v42.z.string().nullish(),
|
|
321
|
+
content: import_v42.z.array(perplexityContentPartSchema).nullish()
|
|
322
|
+
}),
|
|
323
|
+
import_v42.z.looseObject({
|
|
324
|
+
type: import_v42.z.literal("search_results"),
|
|
325
|
+
results: import_v42.z.array(perplexitySearchResultSchema).nullish()
|
|
326
|
+
}),
|
|
327
|
+
import_v42.z.looseObject({
|
|
328
|
+
type: import_v42.z.literal("fetch_url_results"),
|
|
329
|
+
contents: import_v42.z.array(perplexityFetchedContentSchema).nullish()
|
|
330
|
+
}),
|
|
331
|
+
import_v42.z.looseObject({
|
|
332
|
+
type: import_v42.z.literal("function_call"),
|
|
333
|
+
id: import_v42.z.string().nullish(),
|
|
334
|
+
call_id: import_v42.z.string().nullish(),
|
|
335
|
+
name: import_v42.z.string().nullish(),
|
|
336
|
+
arguments: import_v42.z.string().nullish(),
|
|
337
|
+
thought_signature: import_v42.z.string().nullish()
|
|
338
|
+
}),
|
|
339
|
+
// Native tool traces remain available in raw responses and raw stream chunks.
|
|
340
|
+
// Their fields (e.g. finance_results.results) have different shapes. Do not
|
|
341
|
+
// validate them as search results, or let malformed handled items fall back.
|
|
342
|
+
import_v42.z.object({
|
|
343
|
+
type: import_v42.z.string().refine((type) => !handledOutputTypes.includes(type))
|
|
344
|
+
}).transform(() => ({ type: "unhandled" }))
|
|
345
|
+
]);
|
|
346
|
+
var perplexityCostSchema = import_v42.z.looseObject({
|
|
347
|
+
currency: import_v42.z.string().optional(),
|
|
348
|
+
input_cost: import_v42.z.number().optional(),
|
|
349
|
+
output_cost: import_v42.z.number().optional(),
|
|
350
|
+
total_cost: import_v42.z.number().optional(),
|
|
351
|
+
cache_creation_cost: import_v42.z.number().nullish(),
|
|
352
|
+
cache_read_cost: import_v42.z.number().nullish(),
|
|
353
|
+
tool_calls_cost: import_v42.z.number().nullish()
|
|
354
|
+
});
|
|
355
|
+
var perplexityUsageSchema = import_v42.z.looseObject({
|
|
356
|
+
input_tokens: import_v42.z.number(),
|
|
357
|
+
output_tokens: import_v42.z.number(),
|
|
358
|
+
total_tokens: import_v42.z.number(),
|
|
359
|
+
input_tokens_details: import_v42.z.looseObject({
|
|
360
|
+
cached_tokens: import_v42.z.number().optional(),
|
|
361
|
+
cache_creation_input_tokens: import_v42.z.number().optional(),
|
|
362
|
+
cache_read_input_tokens: import_v42.z.number().optional()
|
|
363
|
+
}).nullish(),
|
|
364
|
+
output_tokens_details: import_v42.z.looseObject({
|
|
365
|
+
reasoning_tokens: import_v42.z.number().optional()
|
|
366
|
+
}).nullish(),
|
|
367
|
+
tool_calls_details: import_v42.z.record(
|
|
368
|
+
import_v42.z.string(),
|
|
369
|
+
import_v42.z.looseObject({
|
|
370
|
+
invocation: import_v42.z.number().optional()
|
|
371
|
+
})
|
|
372
|
+
).nullish(),
|
|
373
|
+
cost: perplexityCostSchema.nullish()
|
|
374
|
+
});
|
|
375
|
+
var perplexityAgentResponseSchema = import_v42.z.looseObject({
|
|
376
|
+
id: import_v42.z.string(),
|
|
377
|
+
created_at: import_v42.z.number(),
|
|
378
|
+
model: import_v42.z.string(),
|
|
379
|
+
object: import_v42.z.literal("response"),
|
|
380
|
+
output: import_v42.z.array(perplexityOutputItemSchema),
|
|
381
|
+
status: import_v42.z.string(),
|
|
382
|
+
incomplete_details: import_v42.z.looseObject({
|
|
383
|
+
reason: import_v42.z.string()
|
|
384
|
+
}).nullish(),
|
|
385
|
+
error: import_v42.z.looseObject({
|
|
386
|
+
code: import_v42.z.string().optional(),
|
|
387
|
+
message: import_v42.z.string(),
|
|
388
|
+
type: import_v42.z.string().optional()
|
|
389
|
+
}).nullish(),
|
|
390
|
+
usage: perplexityUsageSchema.nullish()
|
|
391
|
+
});
|
|
392
|
+
var perplexityAgentChunkSchema = import_v42.z.looseObject({
|
|
393
|
+
type: import_v42.z.string(),
|
|
394
|
+
sequence_number: import_v42.z.number().nullish(),
|
|
395
|
+
response: perplexityAgentResponseSchema.nullish(),
|
|
396
|
+
item: perplexityOutputItemSchema.nullish(),
|
|
397
|
+
output_index: import_v42.z.number().nullish(),
|
|
398
|
+
item_id: import_v42.z.string().nullish(),
|
|
399
|
+
content_index: import_v42.z.number().nullish(),
|
|
400
|
+
delta: import_v42.z.string().nullish(),
|
|
401
|
+
text: import_v42.z.string().nullish(),
|
|
402
|
+
thought: import_v42.z.string().nullish(),
|
|
403
|
+
queries: import_v42.z.array(import_v42.z.string()).nullish(),
|
|
404
|
+
urls: import_v42.z.array(import_v42.z.string()).nullish(),
|
|
405
|
+
results: import_v42.z.array(perplexitySearchResultSchema).nullish(),
|
|
406
|
+
contents: import_v42.z.array(perplexityFetchedContentSchema).nullish(),
|
|
407
|
+
error: import_v42.z.looseObject({
|
|
408
|
+
code: import_v42.z.string().nullish(),
|
|
409
|
+
message: import_v42.z.string(),
|
|
410
|
+
type: import_v42.z.string().nullish()
|
|
411
|
+
}).nullish()
|
|
412
|
+
});
|
|
413
|
+
var perplexityErrorSchema = import_v42.z.looseObject({
|
|
414
|
+
error: import_v42.z.union([
|
|
415
|
+
import_v42.z.string(),
|
|
416
|
+
import_v42.z.looseObject({
|
|
417
|
+
code: import_v42.z.union([import_v42.z.string(), import_v42.z.number()]).optional(),
|
|
418
|
+
message: import_v42.z.string().nullish(),
|
|
419
|
+
type: import_v42.z.string().nullish()
|
|
420
|
+
})
|
|
421
|
+
]).optional(),
|
|
422
|
+
detail: import_v42.z.union([
|
|
423
|
+
import_v42.z.string(),
|
|
424
|
+
import_v42.z.array(
|
|
425
|
+
import_v42.z.looseObject({
|
|
426
|
+
msg: import_v42.z.string()
|
|
427
|
+
})
|
|
428
|
+
)
|
|
429
|
+
]).optional(),
|
|
430
|
+
message: import_v42.z.string().optional()
|
|
431
|
+
});
|
|
432
|
+
function perplexityErrorToMessage(data) {
|
|
433
|
+
var _a, _b, _c;
|
|
434
|
+
if (typeof data.error === "string") {
|
|
435
|
+
return data.error;
|
|
198
436
|
}
|
|
199
|
-
if (
|
|
200
|
-
|
|
201
|
-
functionality: `file of media type "${part.mediaType}" must specify subtype since it is not passed as inline bytes`
|
|
202
|
-
});
|
|
437
|
+
if (data.error != null) {
|
|
438
|
+
return (_b = (_a = data.error.message) != null ? _a : data.error.type) != null ? _b : "unknown error";
|
|
203
439
|
}
|
|
204
|
-
if (
|
|
205
|
-
return
|
|
440
|
+
if (typeof data.detail === "string") {
|
|
441
|
+
return data.detail;
|
|
206
442
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
function isPdfData(data) {
|
|
212
|
-
const bytes = typeof data === "string" ? (0, import_provider_utils.convertBase64ToUint8Array)(data.substring(0, Math.min(data.length, 8))) : data;
|
|
213
|
-
return bytes.length >= 4 && bytes[0] === 37 && bytes[1] === 80 && bytes[2] === 68 && bytes[3] === 70;
|
|
443
|
+
if (Array.isArray(data.detail)) {
|
|
444
|
+
return data.detail.map((detail) => detail.msg).join(", ");
|
|
445
|
+
}
|
|
446
|
+
return (_c = data.message) != null ? _c : "unknown error";
|
|
214
447
|
}
|
|
215
448
|
|
|
216
|
-
// src/
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
449
|
+
// src/perplexity-language-model-options.ts
|
|
450
|
+
var import_v43 = require("zod/v4");
|
|
451
|
+
var userLocationSchema = import_v43.z.looseObject({
|
|
452
|
+
latitude: import_v43.z.number().optional(),
|
|
453
|
+
longitude: import_v43.z.number().optional(),
|
|
454
|
+
country: import_v43.z.string().optional(),
|
|
455
|
+
city: import_v43.z.string().optional(),
|
|
456
|
+
region: import_v43.z.string().optional()
|
|
457
|
+
});
|
|
458
|
+
var webSearchFiltersSchema = import_v43.z.looseObject({
|
|
459
|
+
search_domain_filter: import_v43.z.array(import_v43.z.string()).optional(),
|
|
460
|
+
search_recency_filter: import_v43.z.enum(["hour", "day", "week", "month", "year"]).optional(),
|
|
461
|
+
search_after_date_filter: import_v43.z.string().optional(),
|
|
462
|
+
search_before_date_filter: import_v43.z.string().optional(),
|
|
463
|
+
last_updated_after_filter: import_v43.z.string().optional(),
|
|
464
|
+
last_updated_before_filter: import_v43.z.string().optional()
|
|
465
|
+
});
|
|
466
|
+
var webSearchToolSchema = import_v43.z.looseObject({
|
|
467
|
+
type: import_v43.z.literal("web_search"),
|
|
468
|
+
filters: webSearchFiltersSchema.optional(),
|
|
469
|
+
max_results: import_v43.z.number().int().positive().optional(),
|
|
470
|
+
max_tokens: import_v43.z.number().optional(),
|
|
471
|
+
max_tokens_per_page: import_v43.z.number().optional(),
|
|
472
|
+
search_context_size: import_v43.z.enum(["low", "medium", "high"]).optional(),
|
|
473
|
+
user_location: userLocationSchema.optional()
|
|
474
|
+
});
|
|
475
|
+
var nativeToolSchema = import_v43.z.union([
|
|
476
|
+
webSearchToolSchema,
|
|
477
|
+
import_v43.z.looseObject({
|
|
478
|
+
type: import_v43.z.literal("fetch_url"),
|
|
479
|
+
max_urls: import_v43.z.number().optional()
|
|
480
|
+
}),
|
|
481
|
+
import_v43.z.looseObject({ type: import_v43.z.literal("people_search") }),
|
|
482
|
+
import_v43.z.looseObject({ type: import_v43.z.literal("finance_search") }),
|
|
483
|
+
import_v43.z.looseObject({ type: import_v43.z.literal("sandbox") }),
|
|
484
|
+
import_v43.z.looseObject({
|
|
485
|
+
type: import_v43.z.literal("mcp"),
|
|
486
|
+
server_label: import_v43.z.string(),
|
|
487
|
+
server_url: import_v43.z.string(),
|
|
488
|
+
allowed_tools: import_v43.z.array(import_v43.z.string()).optional(),
|
|
489
|
+
authorization: import_v43.z.string().optional(),
|
|
490
|
+
defer_loading: import_v43.z.boolean().optional(),
|
|
491
|
+
headers: import_v43.z.record(import_v43.z.string(), import_v43.z.string()).optional()
|
|
492
|
+
}),
|
|
493
|
+
import_v43.z.looseObject({
|
|
494
|
+
type: import_v43.z.literal("connector"),
|
|
495
|
+
id: import_v43.z.string(),
|
|
496
|
+
server_label: import_v43.z.string(),
|
|
497
|
+
server_description: import_v43.z.string().optional(),
|
|
498
|
+
allowed_tools: import_v43.z.array(import_v43.z.string()).optional()
|
|
499
|
+
})
|
|
500
|
+
]);
|
|
501
|
+
var perplexityLanguageModelOptions = import_v43.z.looseObject({
|
|
502
|
+
/** Top-level Agent API instructions. */
|
|
503
|
+
instructions: import_v43.z.string().optional(),
|
|
504
|
+
/**
|
|
505
|
+
* Native Agent API tools. AI SDK function tools can also be supplied through
|
|
506
|
+
* the top-level `tools` option on `generateText` and `streamText`.
|
|
507
|
+
*/
|
|
508
|
+
tools: import_v43.z.array(nativeToolSchema).optional(),
|
|
509
|
+
/** A fallback model list for Agent API routing. */
|
|
510
|
+
models: import_v43.z.array(import_v43.z.string()).optional(),
|
|
511
|
+
/** Maximum number of agentic steps. */
|
|
512
|
+
max_steps: import_v43.z.number().int().positive().optional(),
|
|
513
|
+
/** Maximum number of native tool calls. */
|
|
514
|
+
max_tool_calls: import_v43.z.number().int().nonnegative().optional(),
|
|
515
|
+
/** Continue a conversation from an earlier Agent API response. */
|
|
516
|
+
previous_response_id: import_v43.z.string().optional(),
|
|
517
|
+
/**
|
|
518
|
+
* Whether the response can be retrieved later. Setting this to false does
|
|
519
|
+
* not disable persistence or prevent previous_response_id continuations.
|
|
520
|
+
*/
|
|
521
|
+
store: import_v43.z.boolean().optional(),
|
|
522
|
+
/** Preferred response language as an ISO 639-1 language code. */
|
|
523
|
+
language_preference: import_v43.z.string().optional(),
|
|
524
|
+
/** Agent API reasoning configuration. */
|
|
525
|
+
reasoning: import_v43.z.looseObject({
|
|
526
|
+
effort: import_v43.z.enum(["minimal", "low", "medium", "high", "xhigh"]).optional()
|
|
527
|
+
}).optional(),
|
|
528
|
+
/** Agent API skill configuration. */
|
|
529
|
+
skills: import_v43.z.array(
|
|
530
|
+
import_v43.z.union([
|
|
531
|
+
import_v43.z.looseObject({
|
|
532
|
+
type: import_v43.z.literal("builtin"),
|
|
533
|
+
name: import_v43.z.enum([
|
|
534
|
+
"office",
|
|
535
|
+
"office/docx",
|
|
536
|
+
"office/pdf",
|
|
537
|
+
"office/pptx",
|
|
538
|
+
"office/xlsx"
|
|
539
|
+
])
|
|
540
|
+
}),
|
|
541
|
+
import_v43.z.looseObject({
|
|
542
|
+
type: import_v43.z.literal("inline"),
|
|
543
|
+
name: import_v43.z.string(),
|
|
544
|
+
description: import_v43.z.string(),
|
|
545
|
+
instructions: import_v43.z.string()
|
|
546
|
+
})
|
|
547
|
+
])
|
|
548
|
+
).optional()
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
// src/perplexity-prepare-tools.ts
|
|
552
|
+
function preparePerplexityTools({
|
|
553
|
+
tools,
|
|
554
|
+
toolChoice
|
|
555
|
+
}) {
|
|
556
|
+
const preparedTools = [];
|
|
557
|
+
const warnings = [];
|
|
558
|
+
for (const tool of tools != null ? tools : []) {
|
|
559
|
+
if (tool.type === "provider") {
|
|
560
|
+
warnings.push({
|
|
561
|
+
type: "unsupported",
|
|
562
|
+
feature: `provider-defined tool ${tool.name}`
|
|
563
|
+
});
|
|
564
|
+
continue;
|
|
565
|
+
}
|
|
566
|
+
preparedTools.push({
|
|
567
|
+
type: "function",
|
|
568
|
+
name: tool.name,
|
|
569
|
+
description: tool.description,
|
|
570
|
+
parameters: tool.inputSchema,
|
|
571
|
+
strict: tool.strict
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
if (toolChoice != null && toolChoice.type !== "auto") {
|
|
575
|
+
warnings.push({
|
|
576
|
+
type: "unsupported",
|
|
577
|
+
feature: "toolChoice",
|
|
578
|
+
details: "The Perplexity Agent API currently selects tools automatically."
|
|
579
|
+
});
|
|
224
580
|
}
|
|
581
|
+
return { tools: preparedTools, warnings };
|
|
225
582
|
}
|
|
226
583
|
|
|
227
584
|
// src/perplexity-language-model.ts
|
|
585
|
+
var presetIds = /* @__PURE__ */ new Set([
|
|
586
|
+
"fast",
|
|
587
|
+
"low",
|
|
588
|
+
"medium",
|
|
589
|
+
"high",
|
|
590
|
+
"xhigh"
|
|
591
|
+
]);
|
|
592
|
+
function getModelSelection(modelId) {
|
|
593
|
+
if (presetIds.has(modelId)) {
|
|
594
|
+
return { preset: modelId };
|
|
595
|
+
}
|
|
596
|
+
return { model: modelId };
|
|
597
|
+
}
|
|
598
|
+
function getResponseMetadata(response) {
|
|
599
|
+
var _a, _b;
|
|
600
|
+
return {
|
|
601
|
+
id: (_a = response.id) != null ? _a : void 0,
|
|
602
|
+
modelId: (_b = response.model) != null ? _b : void 0,
|
|
603
|
+
timestamp: response.created_at != null ? new Date(response.created_at * 1e3) : void 0
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
function getProviderMetadata(usage) {
|
|
607
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
608
|
+
const cost = usage == null ? void 0 : usage.cost;
|
|
609
|
+
const numSearchQueries = (usage == null ? void 0 : usage.tool_calls_details) ? Object.entries(usage.tool_calls_details).filter(([name]) => name.includes("search")).reduce((total, [, details]) => {
|
|
610
|
+
var _a2;
|
|
611
|
+
return total + ((_a2 = details.invocation) != null ? _a2 : 0);
|
|
612
|
+
}, 0) : null;
|
|
613
|
+
return {
|
|
614
|
+
perplexity: {
|
|
615
|
+
usage: {
|
|
616
|
+
citationTokens: null,
|
|
617
|
+
numSearchQueries
|
|
618
|
+
},
|
|
619
|
+
images: null,
|
|
620
|
+
cost: cost == null ? null : {
|
|
621
|
+
inputTokensCost: (_a = cost.input_cost) != null ? _a : null,
|
|
622
|
+
outputTokensCost: (_b = cost.output_cost) != null ? _b : null,
|
|
623
|
+
requestCost: null,
|
|
624
|
+
totalCost: (_c = cost.total_cost) != null ? _c : null,
|
|
625
|
+
currency: (_d = cost.currency) != null ? _d : null,
|
|
626
|
+
cacheCreationCost: (_e = cost.cache_creation_cost) != null ? _e : null,
|
|
627
|
+
cacheReadCost: (_f = cost.cache_read_cost) != null ? _f : null,
|
|
628
|
+
toolCallsCost: (_g = cost.tool_calls_cost) != null ? _g : null
|
|
629
|
+
},
|
|
630
|
+
toolCalls: (usage == null ? void 0 : usage.tool_calls_details) == null ? null : Object.fromEntries(
|
|
631
|
+
Object.entries(usage.tool_calls_details).map(
|
|
632
|
+
([name, details]) => {
|
|
633
|
+
var _a2;
|
|
634
|
+
return [
|
|
635
|
+
name,
|
|
636
|
+
{ invocation: (_a2 = details.invocation) != null ? _a2 : null }
|
|
637
|
+
];
|
|
638
|
+
}
|
|
639
|
+
)
|
|
640
|
+
)
|
|
641
|
+
}
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
function createSource(result, generateId2) {
|
|
645
|
+
var _a, _b, _c, _d, _e;
|
|
646
|
+
return {
|
|
647
|
+
type: "source",
|
|
648
|
+
sourceType: "url",
|
|
649
|
+
id: result.id == null ? generateId2() : String(result.id),
|
|
650
|
+
url: result.url,
|
|
651
|
+
title: result.title,
|
|
652
|
+
providerMetadata: {
|
|
653
|
+
perplexity: {
|
|
654
|
+
resultId: (_a = result.id) != null ? _a : null,
|
|
655
|
+
snippet: (_b = result.snippet) != null ? _b : null,
|
|
656
|
+
date: (_c = result.date) != null ? _c : null,
|
|
657
|
+
lastUpdated: (_d = result.last_updated) != null ? _d : null,
|
|
658
|
+
source: (_e = result.source) != null ? _e : null
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
function hasSearchResultId(source) {
|
|
664
|
+
var _a, _b;
|
|
665
|
+
return typeof ((_b = (_a = source.providerMetadata) == null ? void 0 : _a.perplexity) == null ? void 0 : _b.resultId) === "number";
|
|
666
|
+
}
|
|
667
|
+
function getSearchResults(item) {
|
|
668
|
+
var _a;
|
|
669
|
+
return item.type === "search_results" ? (_a = item.results) != null ? _a : [] : [];
|
|
670
|
+
}
|
|
671
|
+
function getFetchedSources(item) {
|
|
672
|
+
var _a;
|
|
673
|
+
return item.type === "fetch_url_results" ? (_a = item.contents) != null ? _a : [] : [];
|
|
674
|
+
}
|
|
228
675
|
var PerplexityLanguageModel = class {
|
|
229
676
|
constructor(modelId, config) {
|
|
230
677
|
this.specificationVersion = "v3";
|
|
231
678
|
this.provider = "perplexity";
|
|
232
679
|
this.supportedUrls = {
|
|
233
|
-
|
|
680
|
+
"image/*": [/^https?:\/\/.*$/]
|
|
234
681
|
};
|
|
235
682
|
this.modelId = modelId;
|
|
236
683
|
this.config = config;
|
|
237
684
|
}
|
|
238
|
-
getArgs({
|
|
685
|
+
async getArgs({
|
|
239
686
|
prompt,
|
|
240
687
|
maxOutputTokens,
|
|
241
688
|
temperature,
|
|
@@ -246,85 +693,176 @@ var PerplexityLanguageModel = class {
|
|
|
246
693
|
stopSequences,
|
|
247
694
|
responseFormat,
|
|
248
695
|
seed,
|
|
249
|
-
providerOptions
|
|
696
|
+
providerOptions,
|
|
697
|
+
tools,
|
|
698
|
+
toolChoice
|
|
250
699
|
}) {
|
|
251
|
-
var _a;
|
|
700
|
+
var _a, _b;
|
|
252
701
|
const warnings = [];
|
|
702
|
+
const perplexityOptions = (_a = await (0, import_provider_utils2.parseProviderOptions)({
|
|
703
|
+
provider: "perplexity",
|
|
704
|
+
providerOptions,
|
|
705
|
+
schema: perplexityLanguageModelOptions
|
|
706
|
+
})) != null ? _a : {};
|
|
253
707
|
if (topK != null) {
|
|
254
708
|
warnings.push({ type: "unsupported", feature: "topK" });
|
|
255
709
|
}
|
|
710
|
+
if (frequencyPenalty != null) {
|
|
711
|
+
warnings.push({ type: "unsupported", feature: "frequencyPenalty" });
|
|
712
|
+
}
|
|
713
|
+
if (presencePenalty != null) {
|
|
714
|
+
warnings.push({ type: "unsupported", feature: "presencePenalty" });
|
|
715
|
+
}
|
|
256
716
|
if (stopSequences != null) {
|
|
257
717
|
warnings.push({ type: "unsupported", feature: "stopSequences" });
|
|
258
718
|
}
|
|
259
719
|
if (seed != null) {
|
|
260
720
|
warnings.push({ type: "unsupported", feature: "seed" });
|
|
261
721
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
722
|
+
const { tools: nativeTools, ...agentOptions } = perplexityOptions;
|
|
723
|
+
const modelSelection = getModelSelection(this.modelId);
|
|
724
|
+
const { input, warnings: inputWarnings } = convertToPerplexityInput(prompt);
|
|
725
|
+
warnings.push(...inputWarnings);
|
|
726
|
+
const { tools: functionTools, warnings: toolWarnings } = preparePerplexityTools({ tools, toolChoice });
|
|
727
|
+
warnings.push(...toolWarnings);
|
|
728
|
+
const agentTools = [
|
|
729
|
+
...nativeTools != null ? nativeTools : [],
|
|
730
|
+
...functionTools
|
|
731
|
+
];
|
|
732
|
+
const body = {
|
|
733
|
+
...agentOptions,
|
|
734
|
+
...modelSelection,
|
|
735
|
+
input,
|
|
736
|
+
max_output_tokens: maxOutputTokens,
|
|
737
|
+
temperature,
|
|
738
|
+
top_p: topP,
|
|
739
|
+
response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema != null ? {
|
|
740
|
+
type: "json_schema",
|
|
741
|
+
json_schema: {
|
|
742
|
+
name: (_b = responseFormat.name) != null ? _b : "response",
|
|
743
|
+
description: responseFormat.description,
|
|
744
|
+
schema: responseFormat.schema,
|
|
745
|
+
strict: true
|
|
746
|
+
}
|
|
747
|
+
} : void 0,
|
|
748
|
+
tools: agentTools.length > 0 ? agentTools : void 0
|
|
284
749
|
};
|
|
750
|
+
if ((responseFormat == null ? void 0 : responseFormat.type) === "json" && responseFormat.schema == null) {
|
|
751
|
+
warnings.push({
|
|
752
|
+
type: "unsupported",
|
|
753
|
+
feature: "JSON response format without a schema"
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
return { args: body, warnings };
|
|
285
757
|
}
|
|
286
758
|
async doGenerate(options) {
|
|
287
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k
|
|
288
|
-
const { args: body, warnings } = this.getArgs(options);
|
|
759
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
760
|
+
const { args: body, warnings } = await this.getArgs(options);
|
|
761
|
+
const url = `${this.config.baseURL}/v1/agent`;
|
|
289
762
|
const {
|
|
290
763
|
responseHeaders,
|
|
291
764
|
value: response,
|
|
292
765
|
rawValue: rawResponse
|
|
293
766
|
} = await (0, import_provider_utils2.postJsonToApi)({
|
|
294
|
-
url
|
|
295
|
-
headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
|
|
767
|
+
url,
|
|
768
|
+
headers: (0, import_provider_utils2.combineHeaders)((_b = (_a = this.config).headers) == null ? void 0 : _b.call(_a), options.headers),
|
|
296
769
|
body,
|
|
297
770
|
failedResponseHandler: (0, import_provider_utils2.createJsonErrorResponseHandler)({
|
|
298
771
|
errorSchema: perplexityErrorSchema,
|
|
299
|
-
errorToMessage
|
|
772
|
+
errorToMessage: perplexityErrorToMessage
|
|
300
773
|
}),
|
|
301
774
|
successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(
|
|
302
|
-
|
|
775
|
+
perplexityAgentResponseSchema
|
|
303
776
|
),
|
|
304
777
|
abortSignal: options.abortSignal,
|
|
305
778
|
fetch: this.config.fetch
|
|
306
779
|
});
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
780
|
+
if (response.error != null || response.status === "failed") {
|
|
781
|
+
throw new import_provider2.APICallError({
|
|
782
|
+
message: (_d = (_c = response.error) == null ? void 0 : _c.message) != null ? _d : "Perplexity response failed",
|
|
783
|
+
url,
|
|
784
|
+
requestBodyValues: body,
|
|
785
|
+
statusCode: 400,
|
|
786
|
+
responseHeaders,
|
|
787
|
+
responseBody: rawResponse,
|
|
788
|
+
isRetryable: false
|
|
789
|
+
});
|
|
312
790
|
}
|
|
313
|
-
|
|
314
|
-
|
|
791
|
+
const content = [];
|
|
792
|
+
const sourceIndexesByUrl = /* @__PURE__ */ new Map();
|
|
793
|
+
let hasFunctionCall = false;
|
|
794
|
+
const addSource = (source) => {
|
|
795
|
+
const existingIndex = sourceIndexesByUrl.get(source.url);
|
|
796
|
+
if (existingIndex == null) {
|
|
797
|
+
sourceIndexesByUrl.set(source.url, content.length);
|
|
798
|
+
content.push(source);
|
|
799
|
+
} else if (hasSearchResultId(source) && !hasSearchResultId(content[existingIndex])) {
|
|
800
|
+
content[existingIndex] = source;
|
|
801
|
+
}
|
|
802
|
+
};
|
|
803
|
+
for (const item of response.output) {
|
|
804
|
+
if (item.type === "message") {
|
|
805
|
+
for (const part of (_e = item.content) != null ? _e : []) {
|
|
806
|
+
if (part.type === "output_text" && part.text != null) {
|
|
807
|
+
content.push({ type: "text", text: part.text });
|
|
808
|
+
}
|
|
809
|
+
for (const annotation of (_f = part.annotations) != null ? _f : []) {
|
|
810
|
+
if (annotation.url != null) {
|
|
811
|
+
addSource({
|
|
812
|
+
type: "source",
|
|
813
|
+
sourceType: "url",
|
|
814
|
+
id: this.config.generateId(),
|
|
815
|
+
url: annotation.url,
|
|
816
|
+
title: annotation.title
|
|
817
|
+
});
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
} else if (item.type === "search_results") {
|
|
822
|
+
for (const result of getSearchResults(item)) {
|
|
823
|
+
addSource(createSource(result, this.config.generateId));
|
|
824
|
+
}
|
|
825
|
+
} else if (item.type === "fetch_url_results") {
|
|
826
|
+
for (const result of getFetchedSources(item)) {
|
|
827
|
+
addSource({
|
|
828
|
+
type: "source",
|
|
829
|
+
sourceType: "url",
|
|
830
|
+
id: this.config.generateId(),
|
|
831
|
+
url: result.url,
|
|
832
|
+
title: result.title,
|
|
833
|
+
providerMetadata: {
|
|
834
|
+
perplexity: { snippet: (_g = result.snippet) != null ? _g : null }
|
|
835
|
+
}
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
} else if (item.type === "function_call" && item.call_id != null && item.name != null && item.arguments != null) {
|
|
839
|
+
hasFunctionCall = true;
|
|
315
840
|
content.push({
|
|
316
|
-
type: "
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
841
|
+
type: "tool-call",
|
|
842
|
+
toolCallId: item.call_id,
|
|
843
|
+
toolName: item.name,
|
|
844
|
+
input: item.arguments,
|
|
845
|
+
providerMetadata: {
|
|
846
|
+
perplexity: {
|
|
847
|
+
itemId: (_h = item.id) != null ? _h : null,
|
|
848
|
+
...item.thought_signature != null && {
|
|
849
|
+
thoughtSignature: item.thought_signature
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
}
|
|
320
853
|
});
|
|
321
854
|
}
|
|
322
855
|
}
|
|
856
|
+
const finishReason = (_j = (_i = response.incomplete_details) == null ? void 0 : _i.reason) != null ? _j : response.status;
|
|
323
857
|
return {
|
|
324
858
|
content,
|
|
325
859
|
finishReason: {
|
|
326
|
-
unified: mapPerplexityFinishReason(
|
|
327
|
-
|
|
860
|
+
unified: mapPerplexityFinishReason({
|
|
861
|
+
status: response.status,
|
|
862
|
+
incompleteReason: (_k = response.incomplete_details) == null ? void 0 : _k.reason,
|
|
863
|
+
hasFunctionCall
|
|
864
|
+
}),
|
|
865
|
+
raw: finishReason
|
|
328
866
|
},
|
|
329
867
|
usage: convertPerplexityUsage(response.usage),
|
|
330
868
|
request: { body },
|
|
@@ -334,41 +872,23 @@ var PerplexityLanguageModel = class {
|
|
|
334
872
|
body: rawResponse
|
|
335
873
|
},
|
|
336
874
|
warnings,
|
|
337
|
-
providerMetadata:
|
|
338
|
-
perplexity: {
|
|
339
|
-
images: (_c = (_b = response.images) == null ? void 0 : _b.map((image) => ({
|
|
340
|
-
imageUrl: image.image_url,
|
|
341
|
-
originUrl: image.origin_url,
|
|
342
|
-
height: image.height,
|
|
343
|
-
width: image.width
|
|
344
|
-
}))) != null ? _c : null,
|
|
345
|
-
usage: {
|
|
346
|
-
citationTokens: (_e = (_d = response.usage) == null ? void 0 : _d.citation_tokens) != null ? _e : null,
|
|
347
|
-
numSearchQueries: (_g = (_f = response.usage) == null ? void 0 : _f.num_search_queries) != null ? _g : null
|
|
348
|
-
},
|
|
349
|
-
cost: ((_h = response.usage) == null ? void 0 : _h.cost) ? {
|
|
350
|
-
inputTokensCost: (_i = response.usage.cost.input_tokens_cost) != null ? _i : null,
|
|
351
|
-
outputTokensCost: (_j = response.usage.cost.output_tokens_cost) != null ? _j : null,
|
|
352
|
-
requestCost: (_k = response.usage.cost.request_cost) != null ? _k : null,
|
|
353
|
-
totalCost: (_l = response.usage.cost.total_cost) != null ? _l : null
|
|
354
|
-
} : null
|
|
355
|
-
}
|
|
356
|
-
}
|
|
875
|
+
providerMetadata: getProviderMetadata(response.usage)
|
|
357
876
|
};
|
|
358
877
|
}
|
|
359
878
|
async doStream(options) {
|
|
360
|
-
|
|
879
|
+
var _a, _b;
|
|
880
|
+
const { args, warnings } = await this.getArgs(options);
|
|
361
881
|
const body = { ...args, stream: true };
|
|
362
882
|
const { responseHeaders, value: response } = await (0, import_provider_utils2.postJsonToApi)({
|
|
363
|
-
url: `${this.config.baseURL}/
|
|
364
|
-
headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
|
|
883
|
+
url: `${this.config.baseURL}/v1/agent`,
|
|
884
|
+
headers: (0, import_provider_utils2.combineHeaders)((_b = (_a = this.config).headers) == null ? void 0 : _b.call(_a), options.headers),
|
|
365
885
|
body,
|
|
366
886
|
failedResponseHandler: (0, import_provider_utils2.createJsonErrorResponseHandler)({
|
|
367
887
|
errorSchema: perplexityErrorSchema,
|
|
368
|
-
errorToMessage
|
|
888
|
+
errorToMessage: perplexityErrorToMessage
|
|
369
889
|
}),
|
|
370
890
|
successfulResponseHandler: (0, import_provider_utils2.createEventSourceResponseHandler)(
|
|
371
|
-
|
|
891
|
+
perplexityAgentChunkSchema
|
|
372
892
|
),
|
|
373
893
|
abortSignal: options.abortSignal,
|
|
374
894
|
fetch: this.config.fetch
|
|
@@ -377,20 +897,15 @@ var PerplexityLanguageModel = class {
|
|
|
377
897
|
unified: "other",
|
|
378
898
|
raw: void 0
|
|
379
899
|
};
|
|
380
|
-
let usage
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
}
|
|
390
|
-
};
|
|
391
|
-
let isFirstChunk = true;
|
|
392
|
-
let isActive = false;
|
|
393
|
-
const self = this;
|
|
900
|
+
let usage;
|
|
901
|
+
let hasFunctionCall = false;
|
|
902
|
+
let hasResponseMetadata = false;
|
|
903
|
+
let activeReasoningId;
|
|
904
|
+
const textStates = /* @__PURE__ */ new Map();
|
|
905
|
+
const emittedSourceUrls = /* @__PURE__ */ new Set();
|
|
906
|
+
const pendingSourcesByUrl = /* @__PURE__ */ new Map();
|
|
907
|
+
const seenFunctionCalls = /* @__PURE__ */ new Set();
|
|
908
|
+
const generateId2 = this.config.generateId;
|
|
394
909
|
return {
|
|
395
910
|
stream: response.pipeThrough(
|
|
396
911
|
new TransformStream({
|
|
@@ -398,84 +913,308 @@ var PerplexityLanguageModel = class {
|
|
|
398
913
|
controller.enqueue({ type: "stream-start", warnings });
|
|
399
914
|
},
|
|
400
915
|
transform(chunk, controller) {
|
|
401
|
-
var
|
|
916
|
+
var _a2, _b2, _c, _d, _e, _f, _g, _h, _i;
|
|
402
917
|
if (options.includeRawChunks) {
|
|
403
918
|
controller.enqueue({ type: "raw", rawValue: chunk.rawValue });
|
|
404
919
|
}
|
|
405
920
|
if (!chunk.success) {
|
|
921
|
+
finishReason = { unified: "error", raw: void 0 };
|
|
406
922
|
controller.enqueue({ type: "error", error: chunk.error });
|
|
407
923
|
return;
|
|
408
924
|
}
|
|
409
925
|
const value = chunk.value;
|
|
410
|
-
|
|
926
|
+
const getTextId = (itemId, outputIndex, contentIndex = 0) => {
|
|
927
|
+
const id = itemId != null ? itemId : String(outputIndex != null ? outputIndex : "text");
|
|
928
|
+
return contentIndex == null || contentIndex === 0 ? id : `${id}:${contentIndex}`;
|
|
929
|
+
};
|
|
930
|
+
const emitTextDelta = (id, delta) => {
|
|
931
|
+
let state = textStates.get(id);
|
|
932
|
+
if (state == null ? void 0 : state.ended) {
|
|
933
|
+
return;
|
|
934
|
+
}
|
|
935
|
+
if (state == null) {
|
|
936
|
+
state = { text: "", ended: false };
|
|
937
|
+
textStates.set(id, state);
|
|
938
|
+
controller.enqueue({ type: "text-start", id });
|
|
939
|
+
}
|
|
940
|
+
state.text += delta;
|
|
941
|
+
controller.enqueue({ type: "text-delta", id, delta });
|
|
942
|
+
};
|
|
943
|
+
const finishText = (id, text) => {
|
|
944
|
+
var _a3;
|
|
945
|
+
const state = textStates.get(id);
|
|
946
|
+
if (state == null ? void 0 : state.ended) {
|
|
947
|
+
return;
|
|
948
|
+
}
|
|
949
|
+
const emittedText = (_a3 = state == null ? void 0 : state.text) != null ? _a3 : "";
|
|
950
|
+
if (text != null && text.startsWith(emittedText) && text.length > emittedText.length) {
|
|
951
|
+
emitTextDelta(id, text.slice(emittedText.length));
|
|
952
|
+
}
|
|
953
|
+
const finalState = textStates.get(id);
|
|
954
|
+
if (finalState != null) {
|
|
955
|
+
finalState.ended = true;
|
|
956
|
+
controller.enqueue({ type: "text-end", id });
|
|
957
|
+
}
|
|
958
|
+
};
|
|
959
|
+
const finishOutputText = (item, outputIndex) => {
|
|
960
|
+
var _a3;
|
|
961
|
+
if (item.type === "message") {
|
|
962
|
+
for (const [contentIndex, part] of ((_a3 = item.content) != null ? _a3 : []).entries()) {
|
|
963
|
+
if (part.type === "output_text") {
|
|
964
|
+
finishText(
|
|
965
|
+
getTextId(item.id, outputIndex, contentIndex),
|
|
966
|
+
part.text
|
|
967
|
+
);
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
};
|
|
972
|
+
const emitSource = (source) => {
|
|
973
|
+
if (emittedSourceUrls.has(source.url)) {
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
if (hasSearchResultId(source)) {
|
|
977
|
+
pendingSourcesByUrl.delete(source.url);
|
|
978
|
+
emittedSourceUrls.add(source.url);
|
|
979
|
+
controller.enqueue(source);
|
|
980
|
+
} else if (!pendingSourcesByUrl.has(source.url)) {
|
|
981
|
+
pendingSourcesByUrl.set(source.url, source);
|
|
982
|
+
}
|
|
983
|
+
};
|
|
984
|
+
const emitReasoningThought = (thought) => {
|
|
985
|
+
if (activeReasoningId != null && thought != null) {
|
|
986
|
+
controller.enqueue({
|
|
987
|
+
type: "reasoning-delta",
|
|
988
|
+
id: activeReasoningId,
|
|
989
|
+
delta: thought
|
|
990
|
+
});
|
|
991
|
+
}
|
|
992
|
+
};
|
|
993
|
+
const emitFunctionCall = (item) => {
|
|
994
|
+
var _a3;
|
|
995
|
+
if (item.type !== "function_call" || item.call_id == null || item.name == null || item.arguments == null || seenFunctionCalls.has(item.call_id)) {
|
|
996
|
+
return;
|
|
997
|
+
}
|
|
998
|
+
seenFunctionCalls.add(item.call_id);
|
|
999
|
+
hasFunctionCall = true;
|
|
411
1000
|
controller.enqueue({
|
|
412
|
-
type: "
|
|
413
|
-
|
|
1001
|
+
type: "tool-input-start",
|
|
1002
|
+
id: item.call_id,
|
|
1003
|
+
toolName: item.name
|
|
414
1004
|
});
|
|
415
|
-
|
|
416
|
-
|
|
1005
|
+
controller.enqueue({
|
|
1006
|
+
type: "tool-input-delta",
|
|
1007
|
+
id: item.call_id,
|
|
1008
|
+
delta: item.arguments
|
|
1009
|
+
});
|
|
1010
|
+
controller.enqueue({ type: "tool-input-end", id: item.call_id });
|
|
1011
|
+
controller.enqueue({
|
|
1012
|
+
type: "tool-call",
|
|
1013
|
+
toolCallId: item.call_id,
|
|
1014
|
+
toolName: item.name,
|
|
1015
|
+
input: item.arguments,
|
|
1016
|
+
providerMetadata: {
|
|
1017
|
+
perplexity: {
|
|
1018
|
+
itemId: (_a3 = item.id) != null ? _a3 : null,
|
|
1019
|
+
...item.thought_signature != null && {
|
|
1020
|
+
thoughtSignature: item.thought_signature
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
});
|
|
1025
|
+
};
|
|
1026
|
+
const emitOutputSources = (item) => {
|
|
1027
|
+
var _a3, _b3, _c2;
|
|
1028
|
+
if (item.type === "message") {
|
|
1029
|
+
for (const part of (_a3 = item.content) != null ? _a3 : []) {
|
|
1030
|
+
for (const annotation of (_b3 = part.annotations) != null ? _b3 : []) {
|
|
1031
|
+
if (annotation.url != null) {
|
|
1032
|
+
emitSource({
|
|
1033
|
+
type: "source",
|
|
1034
|
+
sourceType: "url",
|
|
1035
|
+
id: generateId2(),
|
|
1036
|
+
url: annotation.url,
|
|
1037
|
+
title: annotation.title
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
for (const result of getSearchResults(item)) {
|
|
1044
|
+
emitSource(createSource(result, generateId2));
|
|
1045
|
+
}
|
|
1046
|
+
for (const result of getFetchedSources(item)) {
|
|
1047
|
+
emitSource({
|
|
417
1048
|
type: "source",
|
|
418
1049
|
sourceType: "url",
|
|
419
|
-
id:
|
|
420
|
-
url
|
|
1050
|
+
id: generateId2(),
|
|
1051
|
+
url: result.url,
|
|
1052
|
+
title: result.title,
|
|
1053
|
+
providerMetadata: {
|
|
1054
|
+
perplexity: { snippet: (_c2 = result.snippet) != null ? _c2 : null }
|
|
1055
|
+
}
|
|
421
1056
|
});
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
1057
|
+
}
|
|
1058
|
+
};
|
|
1059
|
+
switch (value.type) {
|
|
1060
|
+
case "response.created":
|
|
1061
|
+
case "response.in_progress": {
|
|
1062
|
+
if (!hasResponseMetadata && value.response != null) {
|
|
1063
|
+
controller.enqueue({
|
|
1064
|
+
type: "response-metadata",
|
|
1065
|
+
...getResponseMetadata(value.response)
|
|
1066
|
+
});
|
|
1067
|
+
hasResponseMetadata = true;
|
|
1068
|
+
}
|
|
1069
|
+
break;
|
|
1070
|
+
}
|
|
1071
|
+
case "response.output_text.delta": {
|
|
1072
|
+
if (value.delta != null) {
|
|
1073
|
+
emitTextDelta(
|
|
1074
|
+
getTextId(
|
|
1075
|
+
value.item_id,
|
|
1076
|
+
value.output_index,
|
|
1077
|
+
value.content_index
|
|
1078
|
+
),
|
|
1079
|
+
value.delta
|
|
1080
|
+
);
|
|
1081
|
+
}
|
|
1082
|
+
break;
|
|
1083
|
+
}
|
|
1084
|
+
case "response.output_text.done": {
|
|
1085
|
+
finishText(
|
|
1086
|
+
getTextId(
|
|
1087
|
+
value.item_id,
|
|
1088
|
+
value.output_index,
|
|
1089
|
+
value.content_index
|
|
1090
|
+
),
|
|
1091
|
+
value.text
|
|
1092
|
+
);
|
|
1093
|
+
break;
|
|
1094
|
+
}
|
|
1095
|
+
case "response.reasoning.started": {
|
|
1096
|
+
if (activeReasoningId != null) {
|
|
1097
|
+
controller.enqueue({
|
|
1098
|
+
type: "reasoning-end",
|
|
1099
|
+
id: activeReasoningId
|
|
1100
|
+
});
|
|
1101
|
+
}
|
|
1102
|
+
activeReasoningId = `reasoning-${(_a2 = value.sequence_number) != null ? _a2 : generateId2()}`;
|
|
1103
|
+
controller.enqueue({
|
|
1104
|
+
type: "reasoning-start",
|
|
1105
|
+
id: activeReasoningId
|
|
1106
|
+
});
|
|
1107
|
+
emitReasoningThought(value.thought);
|
|
1108
|
+
break;
|
|
1109
|
+
}
|
|
1110
|
+
case "response.reasoning.search_queries":
|
|
1111
|
+
case "response.reasoning.fetch_url_queries": {
|
|
1112
|
+
emitReasoningThought(value.thought);
|
|
1113
|
+
break;
|
|
1114
|
+
}
|
|
1115
|
+
case "response.reasoning.search_results": {
|
|
1116
|
+
emitReasoningThought(value.thought);
|
|
1117
|
+
for (const result of (_b2 = value.results) != null ? _b2 : []) {
|
|
1118
|
+
emitSource(createSource(result, generateId2));
|
|
1119
|
+
}
|
|
1120
|
+
break;
|
|
1121
|
+
}
|
|
1122
|
+
case "response.reasoning.fetch_url_results": {
|
|
1123
|
+
emitReasoningThought(value.thought);
|
|
1124
|
+
for (const result of (_c = value.contents) != null ? _c : []) {
|
|
1125
|
+
emitSource({
|
|
1126
|
+
type: "source",
|
|
1127
|
+
sourceType: "url",
|
|
1128
|
+
id: generateId2(),
|
|
1129
|
+
url: result.url,
|
|
1130
|
+
title: result.title,
|
|
1131
|
+
providerMetadata: {
|
|
1132
|
+
perplexity: { snippet: (_d = result.snippet) != null ? _d : null }
|
|
1133
|
+
}
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
break;
|
|
1137
|
+
}
|
|
1138
|
+
case "response.reasoning.stopped": {
|
|
1139
|
+
emitReasoningThought(value.thought);
|
|
1140
|
+
if (activeReasoningId != null) {
|
|
1141
|
+
controller.enqueue({
|
|
1142
|
+
type: "reasoning-end",
|
|
1143
|
+
id: activeReasoningId
|
|
1144
|
+
});
|
|
1145
|
+
activeReasoningId = void 0;
|
|
1146
|
+
}
|
|
1147
|
+
break;
|
|
1148
|
+
}
|
|
1149
|
+
case "response.output_item.done": {
|
|
1150
|
+
if (value.item != null) {
|
|
1151
|
+
finishOutputText(value.item, value.output_index);
|
|
1152
|
+
emitOutputSources(value.item);
|
|
1153
|
+
emitFunctionCall(value.item);
|
|
1154
|
+
}
|
|
1155
|
+
break;
|
|
1156
|
+
}
|
|
1157
|
+
case "response.completed":
|
|
1158
|
+
case "response.incomplete": {
|
|
1159
|
+
if (value.response != null) {
|
|
1160
|
+
if (!hasResponseMetadata) {
|
|
1161
|
+
controller.enqueue({
|
|
1162
|
+
type: "response-metadata",
|
|
1163
|
+
...getResponseMetadata(value.response)
|
|
1164
|
+
});
|
|
1165
|
+
hasResponseMetadata = true;
|
|
1166
|
+
}
|
|
1167
|
+
for (const [
|
|
1168
|
+
outputIndex,
|
|
1169
|
+
item
|
|
1170
|
+
] of value.response.output.entries()) {
|
|
1171
|
+
finishOutputText(item, outputIndex);
|
|
1172
|
+
emitOutputSources(item);
|
|
1173
|
+
emitFunctionCall(item);
|
|
1174
|
+
}
|
|
1175
|
+
usage = (_e = value.response.usage) != null ? _e : void 0;
|
|
1176
|
+
const rawFinishReason = (_g = (_f = value.response.incomplete_details) == null ? void 0 : _f.reason) != null ? _g : value.response.status;
|
|
1177
|
+
finishReason = {
|
|
1178
|
+
unified: mapPerplexityFinishReason({
|
|
1179
|
+
status: value.response.status,
|
|
1180
|
+
incompleteReason: (_h = value.response.incomplete_details) == null ? void 0 : _h.reason,
|
|
1181
|
+
hasFunctionCall
|
|
1182
|
+
}),
|
|
1183
|
+
raw: rawFinishReason
|
|
1184
|
+
};
|
|
1185
|
+
}
|
|
1186
|
+
break;
|
|
1187
|
+
}
|
|
1188
|
+
case "response.failed": {
|
|
1189
|
+
finishReason = { unified: "error", raw: "failed" };
|
|
1190
|
+
controller.enqueue({
|
|
1191
|
+
type: "error",
|
|
1192
|
+
error: (_i = value.error) != null ? _i : new Error("Perplexity response failed")
|
|
1193
|
+
});
|
|
1194
|
+
break;
|
|
1195
|
+
}
|
|
452
1196
|
}
|
|
453
|
-
|
|
454
|
-
|
|
1197
|
+
},
|
|
1198
|
+
flush(controller) {
|
|
1199
|
+
for (const source of pendingSourcesByUrl.values()) {
|
|
1200
|
+
controller.enqueue(source);
|
|
455
1201
|
}
|
|
456
|
-
|
|
457
|
-
const textContent = delta.content;
|
|
458
|
-
if (textContent != null) {
|
|
459
|
-
if (!isActive) {
|
|
460
|
-
controller.enqueue({ type: "text-start", id: "0" });
|
|
461
|
-
isActive = true;
|
|
462
|
-
}
|
|
1202
|
+
if (activeReasoningId != null) {
|
|
463
1203
|
controller.enqueue({
|
|
464
|
-
type: "
|
|
465
|
-
id:
|
|
466
|
-
delta: textContent
|
|
1204
|
+
type: "reasoning-end",
|
|
1205
|
+
id: activeReasoningId
|
|
467
1206
|
});
|
|
468
1207
|
}
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
1208
|
+
for (const [id, state] of textStates) {
|
|
1209
|
+
if (!state.ended) {
|
|
1210
|
+
controller.enqueue({ type: "text-end", id });
|
|
1211
|
+
}
|
|
473
1212
|
}
|
|
474
1213
|
controller.enqueue({
|
|
475
1214
|
type: "finish",
|
|
476
1215
|
finishReason,
|
|
477
1216
|
usage: convertPerplexityUsage(usage),
|
|
478
|
-
providerMetadata
|
|
1217
|
+
providerMetadata: getProviderMetadata(usage)
|
|
479
1218
|
});
|
|
480
1219
|
}
|
|
481
1220
|
})
|
|
@@ -485,87 +1224,6 @@ var PerplexityLanguageModel = class {
|
|
|
485
1224
|
};
|
|
486
1225
|
}
|
|
487
1226
|
};
|
|
488
|
-
function getResponseMetadata({
|
|
489
|
-
id,
|
|
490
|
-
model,
|
|
491
|
-
created
|
|
492
|
-
}) {
|
|
493
|
-
return {
|
|
494
|
-
id,
|
|
495
|
-
modelId: model,
|
|
496
|
-
timestamp: new Date(created * 1e3)
|
|
497
|
-
};
|
|
498
|
-
}
|
|
499
|
-
var perplexityCostSchema = import_v42.z.object({
|
|
500
|
-
input_tokens_cost: import_v42.z.number().nullish(),
|
|
501
|
-
output_tokens_cost: import_v42.z.number().nullish(),
|
|
502
|
-
reasoning_tokens_cost: import_v42.z.number().nullish(),
|
|
503
|
-
request_cost: import_v42.z.number().nullish(),
|
|
504
|
-
citation_tokens_cost: import_v42.z.number().nullish(),
|
|
505
|
-
search_queries_cost: import_v42.z.number().nullish(),
|
|
506
|
-
total_cost: import_v42.z.number().nullish()
|
|
507
|
-
}).catchall(import_v42.z.json());
|
|
508
|
-
var perplexityUsageSchema = import_v42.z.object({
|
|
509
|
-
prompt_tokens: import_v42.z.number(),
|
|
510
|
-
completion_tokens: import_v42.z.number(),
|
|
511
|
-
total_tokens: import_v42.z.number().nullish(),
|
|
512
|
-
search_context_size: import_v42.z.enum(["low", "medium", "high"]).nullish(),
|
|
513
|
-
citation_tokens: import_v42.z.number().nullish(),
|
|
514
|
-
num_search_queries: import_v42.z.number().nullish(),
|
|
515
|
-
reasoning_tokens: import_v42.z.number().nullish(),
|
|
516
|
-
cost: perplexityCostSchema.nullish()
|
|
517
|
-
}).catchall(import_v42.z.json());
|
|
518
|
-
var perplexityImageSchema = import_v42.z.object({
|
|
519
|
-
image_url: import_v42.z.string(),
|
|
520
|
-
origin_url: import_v42.z.string(),
|
|
521
|
-
height: import_v42.z.number(),
|
|
522
|
-
width: import_v42.z.number()
|
|
523
|
-
});
|
|
524
|
-
var perplexityResponseSchema = import_v42.z.object({
|
|
525
|
-
id: import_v42.z.string(),
|
|
526
|
-
created: import_v42.z.number(),
|
|
527
|
-
model: import_v42.z.string(),
|
|
528
|
-
choices: import_v42.z.array(
|
|
529
|
-
import_v42.z.object({
|
|
530
|
-
message: import_v42.z.object({
|
|
531
|
-
role: import_v42.z.literal("assistant"),
|
|
532
|
-
content: import_v42.z.string()
|
|
533
|
-
}),
|
|
534
|
-
finish_reason: import_v42.z.string().nullish()
|
|
535
|
-
})
|
|
536
|
-
),
|
|
537
|
-
citations: import_v42.z.array(import_v42.z.string()).nullish(),
|
|
538
|
-
images: import_v42.z.array(perplexityImageSchema).nullish(),
|
|
539
|
-
usage: perplexityUsageSchema.nullish()
|
|
540
|
-
});
|
|
541
|
-
var perplexityChunkSchema = import_v42.z.object({
|
|
542
|
-
id: import_v42.z.string(),
|
|
543
|
-
created: import_v42.z.number(),
|
|
544
|
-
model: import_v42.z.string(),
|
|
545
|
-
choices: import_v42.z.array(
|
|
546
|
-
import_v42.z.object({
|
|
547
|
-
delta: import_v42.z.object({
|
|
548
|
-
role: import_v42.z.literal("assistant").optional(),
|
|
549
|
-
content: import_v42.z.string().nullish()
|
|
550
|
-
}),
|
|
551
|
-
finish_reason: import_v42.z.string().nullish()
|
|
552
|
-
})
|
|
553
|
-
),
|
|
554
|
-
citations: import_v42.z.array(import_v42.z.string()).nullish(),
|
|
555
|
-
images: import_v42.z.array(perplexityImageSchema).nullish(),
|
|
556
|
-
usage: perplexityUsageSchema.nullish()
|
|
557
|
-
});
|
|
558
|
-
var perplexityErrorSchema = import_v42.z.object({
|
|
559
|
-
error: import_v42.z.object({
|
|
560
|
-
code: import_v42.z.number(),
|
|
561
|
-
message: import_v42.z.string().nullish(),
|
|
562
|
-
type: import_v42.z.string().nullish()
|
|
563
|
-
})
|
|
564
|
-
});
|
|
565
|
-
var errorToMessage = (data) => {
|
|
566
|
-
var _a, _b;
|
|
567
|
-
return (_b = (_a = data.error.message) != null ? _a : data.error.type) != null ? _b : "unknown error";
|
|
568
|
-
};
|
|
569
1227
|
|
|
570
1228
|
// src/perplexity-embedding-model.ts
|
|
571
1229
|
var PerplexityEmbeddingModel = class {
|
|
@@ -588,7 +1246,7 @@ var PerplexityEmbeddingModel = class {
|
|
|
588
1246
|
}) {
|
|
589
1247
|
var _a, _b, _c, _d, _e, _f;
|
|
590
1248
|
if (values.length > this.maxEmbeddingsPerCall) {
|
|
591
|
-
throw new
|
|
1249
|
+
throw new import_provider3.TooManyEmbeddingValuesForCallError({
|
|
592
1250
|
provider: this.provider,
|
|
593
1251
|
modelId: this.modelId,
|
|
594
1252
|
maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,
|
|
@@ -616,10 +1274,7 @@ var PerplexityEmbeddingModel = class {
|
|
|
616
1274
|
},
|
|
617
1275
|
failedResponseHandler: (0, import_provider_utils3.createJsonErrorResponseHandler)({
|
|
618
1276
|
errorSchema: perplexityErrorSchema,
|
|
619
|
-
errorToMessage:
|
|
620
|
-
var _a2;
|
|
621
|
-
return (_a2 = data.error.message) != null ? _a2 : "Unknown error";
|
|
622
|
-
}
|
|
1277
|
+
errorToMessage: perplexityErrorToMessage
|
|
623
1278
|
}),
|
|
624
1279
|
successfulResponseHandler: (0, import_provider_utils3.createJsonResponseHandler)(
|
|
625
1280
|
perplexityEmbeddingResponseSchema
|
|
@@ -659,20 +1314,20 @@ function decodeEmbedding(base64, encodingFormat) {
|
|
|
659
1314
|
}
|
|
660
1315
|
return Array.from(bytes);
|
|
661
1316
|
}
|
|
662
|
-
var perplexityEmbeddingResponseSchema =
|
|
663
|
-
data:
|
|
664
|
-
usage:
|
|
665
|
-
prompt_tokens:
|
|
666
|
-
cost:
|
|
667
|
-
input_cost:
|
|
668
|
-
total_cost:
|
|
669
|
-
currency:
|
|
1317
|
+
var perplexityEmbeddingResponseSchema = import_v44.z.object({
|
|
1318
|
+
data: import_v44.z.array(import_v44.z.object({ embedding: import_v44.z.string() })),
|
|
1319
|
+
usage: import_v44.z.object({
|
|
1320
|
+
prompt_tokens: import_v44.z.number(),
|
|
1321
|
+
cost: import_v44.z.object({
|
|
1322
|
+
input_cost: import_v44.z.number().nullish(),
|
|
1323
|
+
total_cost: import_v44.z.number().nullish(),
|
|
1324
|
+
currency: import_v44.z.string().nullish()
|
|
670
1325
|
}).nullish()
|
|
671
1326
|
}).nullish()
|
|
672
1327
|
});
|
|
673
1328
|
|
|
674
1329
|
// src/version.ts
|
|
675
|
-
var VERSION = true ? "3.0
|
|
1330
|
+
var VERSION = true ? "3.1.0" : "0.0.0-test";
|
|
676
1331
|
|
|
677
1332
|
// src/perplexity-provider.ts
|
|
678
1333
|
function createPerplexity(options = {}) {
|
|
@@ -712,7 +1367,7 @@ function createPerplexity(options = {}) {
|
|
|
712
1367
|
provider.embeddingModel = createEmbeddingModel;
|
|
713
1368
|
provider.textEmbeddingModel = createEmbeddingModel;
|
|
714
1369
|
provider.imageModel = (modelId) => {
|
|
715
|
-
throw new
|
|
1370
|
+
throw new import_provider4.NoSuchModelError({ modelId, modelType: "imageModel" });
|
|
716
1371
|
};
|
|
717
1372
|
return provider;
|
|
718
1373
|
}
|