Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
runs-on: ${{ github.repository == 'stainless-sdks/perplexity-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Node
uses: actions/setup-node@v6
Expand All @@ -43,7 +43,7 @@ jobs:
contents: read
id-token: write
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Node
uses: actions/setup-node@v6
Expand All @@ -61,7 +61,7 @@ jobs:
github.repository == 'stainless-sdks/perplexity-typescript' &&
!startsWith(github.ref, 'refs/heads/stl/')
id: github-oidc
uses: actions/github-script@v8
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: core.setOutput('github_token', await core.getIDToken());

Expand All @@ -80,7 +80,7 @@ jobs:
runs-on: ${{ github.repository == 'stainless-sdks/perplexity-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Node
uses: actions/setup-node@v6
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish-npm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
id-token: write

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Node
uses: actions/setup-node@v6
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/release-doctor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@ jobs:
if: github.repository == 'perplexityai/perplexity-node' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Check release environment
run: |
bash ./bin/check-release-environment

2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.27.0"
".": "0.28.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 10
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/perplexity-ai%2Fperplexity-e5052719572f5155f4cf704d996e5c7a875700a16f68f2335975ea3d06140b17.yml
openapi_spec_hash: 97d9df5dc228bb6d71be54212bc5b600
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/perplexity-ai/perplexity-cefddb763d493b69465328583ef47cf95655d9cdb3dd0f2c8680fd9679f3c8d8.yml
openapi_spec_hash: 72274397b70c787db6db52dfd34a75ee
config_hash: e09a1767e929614701fb498eaaac682d
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Changelog

## 0.28.0 (2026-05-13)

Full Changelog: [v0.27.0...v0.28.0](https://github.com/perplexityai/perplexity-node/compare/v0.27.0...v0.28.0)

### Features

* **responses:** add people_search and finance_search built-in tools ([f73d971](https://github.com/perplexityai/perplexity-node/commit/f73d971af644ff4d3166fe2f0c319a33a85e5e1c))
* support setting headers via env ([8d99818](https://github.com/perplexityai/perplexity-node/commit/8d99818d6981bc084189213fc03f38408aa4dfe6))


### Chores

* apply prettier formatting to README ([147cf39](https://github.com/perplexityai/perplexity-node/commit/147cf3973b774527f0cba6426bb0c963a67befef))
* **format:** run eslint and prettier separately ([bd0078c](https://github.com/perplexityai/perplexity-node/commit/bd0078c41267bf36971c2a621076d07056bd2e13))
* **formatter:** run prettier and eslint separately ([e5b3c00](https://github.com/perplexityai/perplexity-node/commit/e5b3c0095da82ac41791343a1ba5333ca011fb7f))
* **internal:** codegen related update ([d99d9e3](https://github.com/perplexityai/perplexity-node/commit/d99d9e316cf824d4a67cd29cb9ac026d63351aca))
* **internal:** more robust bootstrap script ([c32e68e](https://github.com/perplexityai/perplexity-node/commit/c32e68ee007146374b83abb0901fde46731f0e3d))
* redact api-key headers in debug logs ([af8b1ee](https://github.com/perplexityai/perplexity-node/commit/af8b1eee91c3ad2fa5f5f1adbb00d836e1560799))

## 0.27.0 (2026-04-14)

Full Changelog: [v0.26.6...v0.27.0](https://github.com/perplexityai/perplexity-node/compare/v0.26.6...v0.27.0)
Expand Down
109 changes: 54 additions & 55 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ const client = new Perplexity({
});

const search = await client.search.create({
query: "latest AI developments 2024",
max_results: 5
query: 'latest AI developments 2024',
max_results: 5,
});

for (const result of search.results) {
Expand Down Expand Up @@ -66,12 +66,8 @@ Run multiple related searches in a single request:

```js
const search = await client.search.create({
query: [
"renewable energy trends 2024",
"solar power innovations",
"wind energy developments"
],
max_results: 10
query: ['renewable energy trends 2024', 'solar power innovations', 'wind energy developments'],
max_results: 10,
});
```

Expand All @@ -81,14 +77,9 @@ Limit search results to specific trusted domains:

```js
const search = await client.search.create({
query: "climate change research",
search_domain_filter: [
"science.org",
"pnas.org",
"cell.com",
"nature.com"
],
max_results: 10
query: 'climate change research',
search_domain_filter: ['science.org', 'pnas.org', 'cell.com', 'nature.com'],
max_results: 10,
});
```

Expand All @@ -99,15 +90,15 @@ Filter results by recency or specific date ranges:
```js
// Get results from the past week
const recentSearch = await client.search.create({
query: "latest AI developments",
search_recency_filter: "week"
query: 'latest AI developments',
search_recency_filter: 'week',
});

// Search within a specific date range
const dateRangeSearch = await client.search.create({
query: "AI developments",
search_after_date_filter: "01/01/2024",
search_before_date_filter: "12/31/2024"
query: 'AI developments',
search_after_date_filter: '01/01/2024',
search_before_date_filter: '12/31/2024',
});
```

Expand All @@ -117,9 +108,9 @@ Search academic sources for research purposes:

```js
const academicSearch = await client.search.create({
query: "machine learning algorithms",
search_mode: "academic",
max_results: 10
query: 'machine learning algorithms',
search_mode: 'academic',
max_results: 10,
});
```

Expand Down Expand Up @@ -158,16 +149,16 @@ const client = new Perplexity({

// Search API types
const searchParams: Perplexity.Search.SearchCreateParams = {
query: "artificial intelligence trends",
query: 'artificial intelligence trends',
max_results: 5,
search_mode: "web"
search_mode: 'web',
};
const searchResponse: Perplexity.Search.SearchCreateResponse = await client.search.create(searchParams);

// Responses API types
const responseParams: Perplexity.ResponseCreateParams = {
input: "What is the capital of France?",
model: "sonar",
input: 'What is the capital of France?',
model: 'sonar',
};
const response: Perplexity.ResponseCreateResponse = await client.responses.create(responseParams);

Expand All @@ -189,17 +180,15 @@ a subclass of `APIError` will be thrown:

```ts
// Search API error handling
const search = await client.search
.create({ query: "AI developments", max_results: 5 })
.catch(async (err) => {
if (err instanceof Perplexity.APIError) {
console.log(err.status); // 400
console.log(err.name); // BadRequestError
console.log(err.headers); // {server: 'nginx', ...}
} else {
throw err;
}
});
const search = await client.search.create({ query: 'AI developments', max_results: 5 }).catch(async (err) => {
if (err instanceof Perplexity.APIError) {
console.log(err.status); // 400
console.log(err.name); // BadRequestError
console.log(err.headers); // {server: 'nginx', ...}
} else {
throw err;
}
});

// Chat completions error handling
const streamChunk = await client.chat.completions
Expand Down Expand Up @@ -246,13 +235,19 @@ const client = new Perplexity({
});

// Or, configure per-request:
await client.search.create({ query: "AI developments", max_results: 5 }, {
maxRetries: 5,
});
await client.search.create(
{ query: 'AI developments', max_results: 5 },
{
maxRetries: 5,
},
);

await client.chat.completions.create({ messages: [{ role: 'user', content: 'What is the capital of France?' }], model: 'sonar' }, {
maxRetries: 5,
});
await client.chat.completions.create(
{ messages: [{ role: 'user', content: 'What is the capital of France?' }], model: 'sonar' },
{
maxRetries: 5,
},
);
```

### Timeouts
Expand All @@ -266,13 +261,19 @@ const client = new Perplexity({
});

// Override per-request:
await client.search.create({ query: "AI developments", max_results: 5 }, {
timeout: 5 * 1000,
});
await client.search.create(
{ query: 'AI developments', max_results: 5 },
{
timeout: 5 * 1000,
},
);

await client.chat.completions.create({ messages: [{ role: 'user', content: 'What is the capital of France?' }], model: 'sonar' }, {
timeout: 5 * 1000,
});
await client.chat.completions.create(
{ messages: [{ role: 'user', content: 'What is the capital of France?' }], model: 'sonar' },
{
timeout: 5 * 1000,
},
);
```

On timeout, an `APIConnectionTimeoutError` is thrown.
Expand All @@ -293,14 +294,12 @@ Unlike `.asResponse()` this method consumes the body, returning once it is parse
const client = new Perplexity();

// With search API
const searchResponse = await client.search
.create({ query: "AI developments", max_results: 5 })
.asResponse();
const searchResponse = await client.search.create({ query: 'AI developments', max_results: 5 }).asResponse();
console.log(searchResponse.headers.get('X-My-Header'));
console.log(searchResponse.statusText); // access the underlying Response object

const { data: search, response: rawSearchResponse } = await client.search
.create({ query: "AI developments", max_results: 5 })
.create({ query: 'AI developments', max_results: 5 })
.withResponse();
console.log(rawSearchResponse.headers.get('X-My-Header'));
console.log(search.results.length);
Expand Down
3 changes: 0 additions & 3 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// @ts-check
import tseslint from 'typescript-eslint';
import unusedImports from 'eslint-plugin-unused-imports';
import prettier from 'eslint-plugin-prettier';

export default tseslint.config(
{
Expand All @@ -14,11 +13,9 @@ export default tseslint.config(
plugins: {
'@typescript-eslint': tseslint.plugin,
'unused-imports': unusedImports,
prettier,
},
rules: {
'no-unused-vars': 'off',
'prettier/prettier': 'error',
'unused-imports/no-unused-imports': 'error',
'no-restricted-imports': [
'error',
Expand Down
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@perplexity-ai/perplexity_ai",
"version": "0.27.0",
"version": "0.28.0",
"description": "The official TypeScript library for the Perplexity API",
"author": "Perplexity <api@perplexity.ai>",
"types": "dist/index.d.ts",
Expand Down Expand Up @@ -36,7 +36,6 @@
"@typescript-eslint/eslint-plugin": "8.31.1",
"@typescript-eslint/parser": "8.31.1",
"eslint": "^9.39.1",
"eslint-plugin-prettier": "^5.4.1",
"eslint-plugin-unused-imports": "^4.1.4",
"iconv-lite": "^0.6.3",
"jest": "^29.4.0",
Expand Down
2 changes: 1 addition & 1 deletion scripts/bootstrap
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ set -e

cd "$(dirname "$0")/.."

if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then
if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then
brew bundle check >/dev/null 2>&1 || {
echo -n "==> Install Homebrew dependencies? (y/N): "
read -r response
Expand Down
9 changes: 3 additions & 6 deletions scripts/fast-format
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,7 @@ if ! [ -z "$ESLINT_FILES" ]; then
fi

echo "==> Running prettier --write"
# format things eslint didn't
PRETTIER_FILES="$(grep '\.\(js\|json\)$' "$FILE_LIST" || true)"
if ! [ -z "$PRETTIER_FILES" ]; then
echo "$PRETTIER_FILES" | xargs ./node_modules/.bin/prettier \
--write --cache --cache-strategy metadata --no-error-on-unmatched-pattern \
'!**/dist' '!**/*.ts' '!**/*.mts' '!**/*.cts' '!**/*.js' '!**/*.mjs' '!**/*.cjs'
if ! [ -z "$FILE_LIST" ]; then
cat "$FILE_LIST" | xargs ./node_modules/.bin/prettier \
--write --cache --cache-strategy metadata --no-error-on-unmatched-pattern --ignore-unknown
fi
3 changes: 1 addition & 2 deletions scripts/format
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,4 @@ echo "==> Running eslint --fix"
./node_modules/.bin/eslint --fix .

echo "==> Running prettier --write"
# format things eslint didn't
./node_modules/.bin/prettier --write --cache --cache-strategy metadata . '!**/dist' '!**/*.ts' '!**/*.mts' '!**/*.cts' '!**/*.js' '!**/*.mjs' '!**/*.cjs'
./node_modules/.bin/prettier --write --cache --cache-strategy metadata .
3 changes: 3 additions & 0 deletions scripts/lint
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ set -e

cd "$(dirname "$0")/.."

echo "==> Running prettier --check"
./node_modules/.bin/prettier --check .

echo "==> Running eslint"
./node_modules/.bin/eslint .

Expand Down
9 changes: 8 additions & 1 deletion scripts/utils/postprocess-files.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,19 @@ async function postprocess() {

// strip out lib="dom", types="node", and types="react" references; these
// are needed at build time, but would pollute the user's TS environment
const transformed = code.replace(
let transformed = code.replace(
/^ *\/\/\/ *<reference +(lib="dom"|types="(node|react)").*?\n/gm,
// replace with same number of characters to avoid breaking source maps
(match) => ' '.repeat(match.length - 1) + '\n',
);

// TypeScript's declaration emitter collapses /** @ts-ignore */ onto the same
// line as the type declaration, which doesn't work. So we convert to // @ts-ignore
// on its own line to properly suppresses errors.
if (file.endsWith('.d.ts') || file.endsWith('.d.mts') || file.endsWith('.d.cts')) {
transformed = transformed.replace(/\/\*\* @ts-ignore\b[^*]*\*\/ /gm, '// @ts-ignore\n');
}

if (transformed !== code) {
console.error(`wrote ${path.relative(process.cwd(), file)}`);
await fs.promises.writeFile(file, transformed, 'utf8');
Expand Down
Loading