diff --git a/.changeset/rude-swans-fetch.md b/.changeset/rude-swans-fetch.md new file mode 100644 index 0000000000000000000000000000000000000000..61fb0857f833a5a506ab3672bbb5ee59d65a46f5 --- /dev/null +++ b/.changeset/rude-swans-fetch.md @@ -0,0 +1,6 @@ +--- +"@llamaindex/perplexity": patch +"@llamaindex/examples": patch +--- + +Added support for Perplexity api diff --git a/examples/package.json b/examples/package.json index e930dce8db5a37a330b20e481394021e26262334..1497616c958358c71790198e4993aebe5d588ba9 100644 --- a/examples/package.json +++ b/examples/package.json @@ -48,6 +48,7 @@ "@llamaindex/fireworks": "^0.0.4", "@llamaindex/together": "^0.0.4", "@llamaindex/jinaai": "^0.0.4", + "@llamaindex/perplexity": "^0.0.1", "@notionhq/client": "^2.2.15", "@pinecone-database/pinecone": "^4.0.0", "@vercel/postgres": "^0.10.0", diff --git a/examples/perplexity.ts b/examples/perplexity.ts new file mode 100644 index 0000000000000000000000000000000000000000..1df63f63c450ca310b3d237ba726db6c23e6da08 --- /dev/null +++ b/examples/perplexity.ts @@ -0,0 +1,44 @@ +import { perplexity } from "@llamaindex/perplexity"; + +(async () => { + const perplexityLLM = perplexity({ + apiKey: process.env.PERPLEXITY_API_KEY!, + model: "sonar", + }); + + // Chat API example + const response = await perplexityLLM.chat({ + messages: [ + { + role: "system", + content: + "You are a helpful AI assistant that provides accurate and concise answers", + }, + { + role: "user", + content: "What is the capital of France?", + }, + ], + }); + console.log("Chat response:", response.message.content); + + // Streaming example + const stream = await perplexityLLM.chat({ + messages: [ + { + role: "system", + content: "You are a creative AI assistant that tells engaging stories", + }, + { + role: "user", + content: "Tell me a short story", + }, + ], + stream: true, + }); + + console.log("\nStreaming response:"); + for await (const chunk of stream) { + process.stdout.write(chunk.delta); + } +})(); diff --git a/packages/providers/perplexity/package.json b/packages/providers/perplexity/package.json new file mode 100644 index 0000000000000000000000000000000000000000..044e9f2aa4a00243403dc20d9d797f7744379c70 --- /dev/null +++ b/packages/providers/perplexity/package.json @@ -0,0 +1,38 @@ +{ + "name": "@llamaindex/perplexity", + "description": "Perplexity Adapter for LlamaIndex", + "version": "0.0.1", + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "exports": { + ".": { + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + }, + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "bunchee", + "dev": "bunchee --watch" + }, + "devDependencies": { + "bunchee": "6.4.0" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@llamaindex/core": "workspace:*", + "@llamaindex/env": "workspace:*", + "@llamaindex/openai": "workspace:*" + } +} diff --git a/packages/providers/perplexity/src/index.ts b/packages/providers/perplexity/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e6679f111f51c327bb3c414234979edfcf3491c1 --- /dev/null +++ b/packages/providers/perplexity/src/index.ts @@ -0,0 +1 @@ +export * from "./llm"; diff --git a/packages/providers/perplexity/src/llm.ts b/packages/providers/perplexity/src/llm.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf3fc7e01b8e2ded5810cded54629e84b8719ea5 --- /dev/null +++ b/packages/providers/perplexity/src/llm.ts @@ -0,0 +1,78 @@ +import { getEnv } from "@llamaindex/env"; +import { Tokenizers } from "@llamaindex/env/tokenizers"; +import { OpenAI } from "@llamaindex/openai"; + +export const PERPLEXITY_MODELS = { + "sonar-deep-research": { + contextWindow: 128000, + }, + "sonar-reasoning-pro": { + contextWindow: 128000, + }, + "sonar-reasoning": { + contextWindow: 128000, + }, + "sonar-pro": { + contextWindow: 200000, + }, + sonar: { + contextWindow: 128000, + }, + "r1-1776": { + contextWindow: 128000, + }, +}; + +type PerplexityModelName = keyof typeof PERPLEXITY_MODELS; +const DEFAULT_MODEL: PerplexityModelName = "sonar"; + +export class Perplexity extends OpenAI { + constructor( + init?: Omit<Partial<OpenAI>, "session"> & { model?: PerplexityModelName }, + ) { + const { + apiKey = getEnv("PERPLEXITY_API_KEY"), + additionalSessionOptions = {}, + model = DEFAULT_MODEL, + ...rest + } = init ?? {}; + + if (!apiKey) { + throw new Error("Perplexity API key is required"); + } + + additionalSessionOptions.baseURL = + additionalSessionOptions.baseURL ?? "https://api.perplexity.ai/"; + + super({ + apiKey, + additionalSessionOptions, + model, + ...rest, + }); + } + + get supportToolCall() { + return false; + } + + get metadata() { + return { + model: this.model, + temperature: this.temperature, + topP: this.topP, + contextWindow: + PERPLEXITY_MODELS[this.model as PerplexityModelName]?.contextWindow, + tokenizer: Tokenizers.CL100K_BASE, + }; + } +} + +/** + * Convenience function to create a new Perplexity instance. + * @param init - Optional initialization parameters for the Perplexity instance. + * @returns A new Perplexity instance. + */ +export const perplexity = ( + init?: ConstructorParameters<typeof Perplexity>[0], +) => new Perplexity(init); diff --git a/packages/providers/perplexity/tsconfig.json b/packages/providers/perplexity/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..7c73f1cf895c5d3637c95a51f842d6ab421e4dde --- /dev/null +++ b/packages/providers/perplexity/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "outDir": "./lib", + "tsBuildInfoFile": "./lib/.tsbuildinfo" + }, + "include": ["./src", "package.json"], + "references": [ + { + "path": "../../core/tsconfig.json" + }, + { + "path": "../../env/tsconfig.json" + } + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5a6b35e954aba16ea2713e03ea32d697c3f921b..a42c6bbc512e92692853606c152c8977467a77df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -656,6 +656,9 @@ importers: '@llamaindex/openai': specifier: ^0.1.60 version: link:../packages/providers/openai + '@llamaindex/perplexity': + specifier: ^0.0.1 + version: link:../packages/providers/perplexity '@llamaindex/pinecone': specifier: ^0.0.13 version: link:../packages/providers/storage/pinecone @@ -1315,6 +1318,22 @@ importers: specifier: 6.4.0 version: 6.4.0(typescript@5.7.3) + packages/providers/perplexity: + dependencies: + '@llamaindex/core': + specifier: workspace:* + version: link:../../core + '@llamaindex/env': + specifier: workspace:* + version: link:../../env + '@llamaindex/openai': + specifier: workspace:* + version: link:../openai + devDependencies: + bunchee: + specifier: 6.4.0 + version: 6.4.0(typescript@5.7.3) + packages/providers/portkey-ai: dependencies: '@llamaindex/core': diff --git a/tsconfig.json b/tsconfig.json index 8af5db8f315d43f4d3253d106660a195a47b382d..0dbe6a06115202cb5baf0b8c4459df920092d628 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -187,6 +187,9 @@ }, { "path": "./packages/providers/jinaai/tsconfig.json" + }, + { + "path": "./packages/providers/perplexity/tsconfig.json" } ] }