@ai-sdk/perplexity 0.0.7 → 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 +19 -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/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 as PerplexityProvider;\n}\n\nexport const perplexity = createPerplexity();\n","import { MetadataExtractor } from '@ai-sdk/openai-compatible';\nimport { safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\n\nexport const perplexityMetadataExtractor: MetadataExtractor = {\n extractMetadata: ({ parsedBody }: { parsedBody: unknown }) => {\n const parsed = safeValidateTypes({\n value: parsedBody,\n schema: perplexityResponseSchema,\n });\n\n return !parsed.success\n ? undefined\n : buildPerplexityMetadata(\n parsed.value.citations ?? undefined,\n parsed.value.images ?? undefined,\n parsed.value.usage ?? undefined,\n );\n },\n\n createStreamExtractor: () => {\n let citations: string[] | undefined;\n let images: PerplexityImageData[] | undefined;\n let usage: PerplexityUsageData | undefined;\n\n return {\n processChunk: (chunk: unknown) => {\n const parsed = safeValidateTypes({\n value: chunk,\n schema: perplexityStreamChunkSchema,\n });\n\n if (parsed.success) {\n citations = parsed.value.citations ?? citations;\n images = parsed.value.images ?? images;\n usage = parsed.value.usage ?? usage;\n }\n },\n buildMetadata: () => buildPerplexityMetadata(citations, images, usage),\n };\n },\n};\n\nconst buildPerplexityMetadata = (\n citations: string[] | undefined,\n images: PerplexityImageData[] | undefined,\n usage: PerplexityUsageData | undefined,\n) => {\n return citations || images || usage\n ? {\n perplexity: {\n ...(citations && { citations }),\n ...(images && {\n images: images.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n })),\n }),\n ...(usage && {\n usage: {\n citationTokens: usage.citation_tokens ?? NaN,\n numSearchQueries: usage.num_search_queries ?? NaN,\n },\n }),\n },\n }\n : undefined;\n};\n\nconst perplexityCitationSchema = z.array(z.string());\n\nconst perplexityImageSchema = z.object({\n image_url: z.string(),\n origin_url: z.string(),\n height: z.number(),\n width: z.number(),\n});\n\ntype PerplexityImageData = z.infer<typeof perplexityImageSchema>;\n\nconst perplexityUsageSchema = z.object({\n citation_tokens: z.number().nullish(),\n num_search_queries: z.number().nullish(),\n});\n\ntype PerplexityUsageData = z.infer<typeof perplexityUsageSchema>;\n\nconst perplexityResponseSchema = z.object({\n citations: perplexityCitationSchema.nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n\nconst perplexityStreamChunkSchema = z.object({\n choices: z\n .array(\n z.object({\n finish_reason: z.string().nullish(),\n delta: z\n .object({\n role: z.string(),\n content: z.string(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n citations: perplexityCitationSchema.nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n"],"mappings":"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","names":["import_provider_utils","import_zod"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/perplexity-provider.ts","../src/perplexity-language-model.ts","../src/convert-to-perplexity-messages.ts","../src/map-perplexity-finish-reason.ts"],"sourcesContent":["export { createPerplexity, perplexity } from './perplexity-provider';\nexport type {\n PerplexityProvider,\n PerplexityProviderSettings,\n} from './perplexity-provider';\n","import {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { PerplexityLanguageModel } from './perplexity-language-model';\nimport { PerplexityLanguageModelId } from './perplexity-language-model-settings';\n\nexport interface PerplexityProvider extends ProviderV1 {\n /**\nCreates an Perplexity chat model for text generation.\n */\n (modelId: PerplexityLanguageModelId): LanguageModelV1;\n\n /**\nCreates an Perplexity language model for text generation.\n */\n languageModel(modelId: PerplexityLanguageModelId): LanguageModelV1;\n}\n\nexport interface PerplexityProviderSettings {\n /**\nBase URL for the perplexity API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport function createPerplexity(\n options: PerplexityProviderSettings = {},\n): PerplexityProvider {\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'PERPLEXITY_API_KEY',\n description: 'Perplexity',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (modelId: PerplexityLanguageModelId) => {\n return new PerplexityLanguageModel(modelId, {\n baseURL: withoutTrailingSlash(\n options.baseURL ?? 'https://api.perplexity.ai',\n )!,\n headers: getHeaders,\n generateId,\n fetch: options.fetch,\n });\n };\n\n const provider = (modelId: PerplexityLanguageModelId) =>\n createLanguageModel(modelId);\n\n provider.languageModel = createLanguageModel;\n\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const perplexity = createPerplexity();\n","import {\n LanguageModelV1,\n LanguageModelV1CallWarning,\n LanguageModelV1FinishReason,\n LanguageModelV1StreamPart,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport { PerplexityLanguageModelId } from './perplexity-language-model-settings';\nimport { convertToPerplexityMessages } from './convert-to-perplexity-messages';\nimport { mapPerplexityFinishReason } from './map-perplexity-finish-reason';\n\ntype PerplexityChatConfig = {\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n generateId: () => string;\n fetch?: FetchFunction;\n};\n\nexport class PerplexityLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = 'v1';\n readonly defaultObjectGenerationMode = 'json';\n readonly supportsStructuredOutputs = true;\n readonly supportsImageUrls = false;\n readonly provider = 'perplexity';\n\n readonly modelId: PerplexityLanguageModelId;\n\n private readonly config: PerplexityChatConfig;\n\n constructor(\n modelId: PerplexityLanguageModelId,\n config: PerplexityChatConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n private getArgs({\n mode,\n prompt,\n maxTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n providerMetadata,\n }: Parameters<LanguageModelV1['doGenerate']>[0]) {\n const type = mode.type;\n\n const warnings: LanguageModelV1CallWarning[] = [];\n\n if (topK != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'topK',\n });\n }\n\n if (stopSequences != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'stopSequences',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'seed',\n });\n }\n\n const baseArgs = {\n // model id:\n model: this.modelId,\n\n // standardized settings:\n frequency_penalty: frequencyPenalty,\n max_tokens: maxTokens,\n presence_penalty: presencePenalty,\n temperature,\n top_k: topK,\n top_p: topP,\n\n // response format:\n response_format:\n responseFormat?.type === 'json'\n ? {\n type: 'json_schema',\n json_schema: { schema: responseFormat.schema },\n }\n : undefined,\n\n // provider extensions\n ...(providerMetadata?.perplexity ?? {}),\n\n // messages:\n messages: convertToPerplexityMessages(prompt),\n };\n\n switch (type) {\n case 'regular': {\n return { args: baseArgs, warnings };\n }\n\n case 'object-json': {\n return {\n args: {\n ...baseArgs,\n response_format: {\n type: 'json_schema',\n json_schema: { schema: mode.schema },\n },\n },\n warnings,\n };\n }\n\n case 'object-tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'tool-mode object generation',\n });\n }\n\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Unsupported type: ${_exhaustiveCheck}`);\n }\n }\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV1['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1['doGenerate']>>> {\n const { args, warnings } = this.getArgs(options);\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: perplexityErrorSchema,\n errorToMessage: data => data.error,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n perplexityResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { messages: rawPrompt, ...rawSettings } = args;\n const choice = response.choices[0];\n const text = choice.message.content;\n\n return {\n text,\n toolCalls: [],\n finishReason: mapPerplexityFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n },\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n request: { body: JSON.stringify(args) },\n response: getResponseMetadata(response),\n warnings,\n sources: response.citations.map(url => ({\n sourceType: 'url',\n id: this.config.generateId(),\n url,\n })),\n providerMetadata: {\n perplexity: {\n images:\n response.images?.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n })) ?? null,\n usage: {\n citationTokens: response.usage.citation_tokens ?? null,\n numSearchQueries: response.usage.num_search_queries ?? null,\n },\n },\n },\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV1['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1['doStream']>>> {\n const { args, warnings } = this.getArgs(options);\n\n const body = { ...args, stream: true };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: perplexityErrorSchema,\n errorToMessage: data => data.error,\n }),\n successfulResponseHandler: createEventSourceResponseHandler(\n perplexityChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { messages: rawPrompt, ...rawSettings } = args;\n\n let finishReason: LanguageModelV1FinishReason = 'unknown';\n let usage: { promptTokens: number; completionTokens: number } = {\n promptTokens: Number.NaN,\n completionTokens: Number.NaN,\n };\n const providerMetadata: {\n perplexity: {\n usage: {\n citationTokens: number | null;\n numSearchQueries: number | null;\n };\n images: Array<{\n imageUrl: string;\n originUrl: string;\n height: number;\n width: number;\n }> | null;\n };\n } = {\n perplexity: {\n usage: {\n citationTokens: null,\n numSearchQueries: null,\n },\n images: null,\n },\n };\n let isFirstChunk = true;\n\n const self = this;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof perplexityChunkSchema>>,\n LanguageModelV1StreamPart\n >({\n transform(chunk, controller) {\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n if (isFirstChunk) {\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value),\n });\n\n value.citations?.forEach(url => {\n controller.enqueue({\n type: 'source',\n source: {\n sourceType: 'url',\n id: self.config.generateId(),\n url,\n },\n });\n });\n\n isFirstChunk = false;\n }\n\n if (value.usage != null) {\n usage = {\n promptTokens: value.usage.prompt_tokens,\n completionTokens: value.usage.completion_tokens,\n };\n\n providerMetadata.perplexity.usage = {\n citationTokens: value.usage.citation_tokens ?? null,\n numSearchQueries: value.usage.num_search_queries ?? null,\n };\n }\n\n if (value.images != null) {\n providerMetadata.perplexity.images = value.images.map(image => ({\n imageUrl: image.image_url,\n originUrl: image.origin_url,\n height: image.height,\n width: image.width,\n }));\n }\n\n const choice = value.choices[0];\n if (choice?.finish_reason != null) {\n finishReason = mapPerplexityFinishReason(choice.finish_reason);\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n const textContent = delta.content;\n\n if (textContent != null) {\n controller.enqueue({\n type: 'text-delta',\n textDelta: textContent,\n });\n }\n },\n\n flush(controller) {\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n providerMetadata,\n });\n },\n }),\n ),\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n request: { body: JSON.stringify(body) },\n warnings,\n };\n }\n}\n\nfunction getResponseMetadata({\n id,\n model,\n created,\n}: {\n id: string;\n created: number;\n model: string;\n}) {\n return {\n id,\n modelId: model,\n timestamp: new Date(created * 1000),\n };\n}\n\nconst perplexityUsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n citation_tokens: z.number().nullish(),\n num_search_queries: z.number().nullish(),\n});\n\nexport const perplexityImageSchema = z.object({\n image_url: z.string(),\n origin_url: z.string(),\n height: z.number(),\n width: z.number(),\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst perplexityResponseSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant'),\n content: z.string(),\n }),\n finish_reason: z.string(),\n }),\n ),\n citations: z.array(z.string()),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema,\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst perplexityChunkSchema = z.object({\n id: z.string(),\n created: z.number(),\n model: z.string(),\n choices: z.array(\n z.object({\n delta: z.object({\n role: z.literal('assistant'),\n content: z.string(),\n }),\n finish_reason: z.string().nullish(),\n }),\n ),\n citations: z.array(z.string()).nullish(),\n images: z.array(perplexityImageSchema).nullish(),\n usage: perplexityUsageSchema.nullish(),\n});\n\nexport const perplexityErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type PerplexityErrorData = z.infer<typeof perplexityErrorSchema>;\n","import {\n LanguageModelV1Prompt,\n UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport { PerplexityPrompt } from './perplexity-language-model-prompt';\n\nexport function convertToPerplexityMessages(\n prompt: LanguageModelV1Prompt,\n): PerplexityPrompt {\n const messages: PerplexityPrompt = [];\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n messages.push({ role: 'system', content });\n break;\n }\n\n case 'user':\n case 'assistant': {\n messages.push({\n role,\n content: content\n .map(part => {\n switch (part.type) {\n case 'text': {\n return part.text;\n }\n case 'image': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Image content parts in user messages',\n });\n }\n case 'file': {\n throw new UnsupportedFunctionalityError({\n functionality: 'File content parts in user messages',\n });\n }\n case 'tool-call': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Tool calls in assistant messages',\n });\n }\n default: {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n })\n .join(''),\n });\n break;\n }\n case 'tool': {\n throw new UnsupportedFunctionalityError({\n functionality: 'Tool messages',\n });\n }\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n","import { LanguageModelV1FinishReason } from '@ai-sdk/provider';\n\nexport function mapPerplexityFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV1FinishReason {\n switch (finishReason) {\n case 'stop':\n case 'length':\n return finishReason;\n default:\n return 'unknown';\n }\n}\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_provider"]}
|
package/dist/index.mjs
CHANGED
|
@@ -2,117 +2,418 @@
|
|
|
2
2
|
import {
|
|
3
3
|
NoSuchModelError
|
|
4
4
|
} from "@ai-sdk/provider";
|
|
5
|
-
import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
|
|
6
5
|
import {
|
|
6
|
+
generateId,
|
|
7
7
|
loadApiKey,
|
|
8
8
|
withoutTrailingSlash
|
|
9
9
|
} from "@ai-sdk/provider-utils";
|
|
10
|
-
import { z as z2 } from "zod";
|
|
11
10
|
|
|
12
|
-
// src/perplexity-
|
|
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
|
};
|