From b6474bae54ac5d5f404da8daaffa2c96c9d801bb Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 20:20:11 +0000 Subject: [PATCH 1/5] chore(tests): remove redundant File import --- tests/uploads.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/uploads.test.ts b/tests/uploads.test.ts index fb15eb2..3682411 100644 --- a/tests/uploads.test.ts +++ b/tests/uploads.test.ts @@ -1,7 +1,6 @@ import fs from 'fs'; import type { ResponseLike } from '@perplexity-ai/perplexity_ai/internal/to-file'; import { toFile } from '@perplexity-ai/perplexity_ai/core/uploads'; -import { File } from 'node:buffer'; class MyClass { name: string = 'foo'; From 5c5edbefd4a8bb3b855cf16b68ea257c477cfede Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 21:15:49 +0000 Subject: [PATCH 2/5] fix(typescript): upgrade tsc-multi so that it works with Node 26 --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 747f586..d704f60 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "publint": "^0.2.12", "ts-jest": "^29.1.0", "ts-node": "^10.5.0", - "tsc-multi": "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz", + "tsc-multi": "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.11/tsc-multi.tgz", "tsconfig-paths": "^4.0.0", "tslib": "^2.8.1", "typescript": "5.8.3", diff --git a/yarn.lock b/yarn.lock index 18e7cbd..00842e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3192,9 +3192,9 @@ ts-node@^10.5.0: v8-compile-cache-lib "^3.0.0" yn "3.1.1" -"tsc-multi@https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz": - version "1.1.9" - resolved "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz#777f6f5d9e26bf0e94e5170990dd3a841d6707cd" +"tsc-multi@https://github.com/stainless-api/tsc-multi/releases/download/v1.1.11/tsc-multi.tgz": + version "1.1.11" + resolved "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.11/tsc-multi.tgz#010247051be13b55abdc98f787c017285149f4f2" dependencies: debug "^4.3.7" fast-glob "^3.3.2" From db5ce72dabb755406bf3f8b21e7d9c85c257f1a2 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 27 May 2026 02:42:02 +0000 Subject: [PATCH 3/5] fix(streaming): yield named SSE events for responses.create + discriminate ResponseStreamEvent union Fixes perplexityai/perplexity-py#53 stainless.yml: replace event_type=null catch-all with kind=fallthrough so the named-event streaming template is generated for responses.create. openapi.yml: tighten each event subschema's `type` from $ref(EventType) to a single-value const so pydantic generates a properly discriminated union. --- .stats.yml | 6 +- src/core/streaming.ts | 4 +- src/resources/responses.ts | 252 +++++-------------------------------- yarn.lock | 6 +- 4 files changed, 35 insertions(+), 233 deletions(-) diff --git a/.stats.yml b/.stats.yml index 04be40b..18e9f23 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 10 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/perplexity-ai/perplexity-8deeee7ec30ff9d4ce52c48452d3660f806e614f14bb8f77209ff43ac449b60e.yml -openapi_spec_hash: 2334e8ee2ebe0d944472ad9385bb79e0 -config_hash: e09a1767e929614701fb498eaaac682d +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/perplexity-ai/perplexity-fcf27eaa172b35187bd87aa80b4d18e2b05c5a8544734d56bd4079064bec4bb4.yml +openapi_spec_hash: 35a516eefbd34cf6620a114bf28c27a5 +config_hash: 86d643a5df0d7478c095d3efa13438dd diff --git a/src/core/streaming.ts b/src/core/streaming.ts index c7092c0..b46cc34 100644 --- a/src/core/streaming.ts +++ b/src/core/streaming.ts @@ -57,9 +57,7 @@ export class Stream implements AsyncIterable { if (sse.event === 'error') { throw new APIError(undefined, safeJSON(sse.data) ?? sse.data, undefined, response.headers); - } - - if (sse.event === null) { + } else { try { yield JSON.parse(sse.data) as Item; } catch (e) { diff --git a/src/resources/responses.ts b/src/resources/responses.ts index 0deca6b..c26b693 100644 --- a/src/resources/responses.ts +++ b/src/resources/responses.ts @@ -315,23 +315,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.created") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.created'; /** * Non-streaming response returned when stream is false @@ -379,23 +365,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.in_progress") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.in_progress'; /** * Non-streaming response returned when stream is false @@ -442,23 +414,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.completed") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.completed'; /** * Non-streaming response returned when stream is false @@ -508,23 +466,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.failed") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.failed'; } /** @@ -542,23 +486,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.output_item.added") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.output_item.added'; } /** @@ -576,23 +506,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.output_item.done") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.output_item.done'; } /** @@ -614,23 +530,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.output_text.delta") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.output_text.delta'; } /** @@ -652,23 +554,9 @@ export namespace ResponseStreamChunk { text: string; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.output_text.done") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.output_text.done'; } /** @@ -682,23 +570,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.reasoning.started") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.reasoning.started'; thought?: string; } @@ -716,23 +590,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.reasoning.search_queries") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.reasoning.search_queries'; thought?: string; } @@ -750,23 +610,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.reasoning.search_results") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.reasoning.search_results'; thought?: string; @@ -784,23 +630,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.reasoning.fetch_url_queries") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.reasoning.fetch_url_queries'; urls: Array; @@ -820,23 +652,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.reasoning.fetch_url_results") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.reasoning.fetch_url_results'; thought?: string; } @@ -874,23 +692,9 @@ export namespace ResponseStreamChunk { sequence_number: number; /** - * SSE event type discriminator + * SSE event type discriminator (always "response.reasoning.stopped") */ - type: - | 'response.created' - | 'response.in_progress' - | 'response.completed' - | 'response.failed' - | 'response.output_item.added' - | 'response.output_item.done' - | 'response.output_text.delta' - | 'response.output_text.done' - | 'response.reasoning.started' - | 'response.reasoning.search_queries' - | 'response.reasoning.search_results' - | 'response.reasoning.fetch_url_queries' - | 'response.reasoning.fetch_url_results' - | 'response.reasoning.stopped'; + type: 'response.reasoning.stopped'; thought?: string; } diff --git a/yarn.lock b/yarn.lock index 00842e3..06fc108 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1215,9 +1215,9 @@ baseline-browser-mapping@^2.9.0: integrity sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg== brace-expansion@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.0.tgz#4f41a41190216ee36067ec381526fe9539c4f0ae" - integrity sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w== + version "2.1.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.1.tgz#c68b1c4111c76aae3a6fba55d496cee10c39dad8" + integrity sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA== dependencies: balanced-match "^1.0.0" From b042a4d2a3c8d848d7cd6dedb9617900198eb669 Mon Sep 17 00:00:00 2001 From: Ryan Buchmayer Date: Tue, 26 May 2026 19:48:25 -0700 Subject: [PATCH 4/5] ci: pin actions/setup-node@v6 to commit SHA Stainless's pin-to-SHA pass (perplexityai/perplexity-py@75475a1) covered actions/checkout and actions/github-script but missed actions/setup-node. The perplexityai org enforces SHA-pinned actions, so the v6 tag fails release CI with 'The action actions/setup-node@v6 is not allowed'. 48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e is the current v6 ref. --- .github/workflows/ci.yml | 6 +++--- .github/workflows/publish-npm.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 57d308f..06577d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Node - uses: actions/setup-node@v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 with: node-version: '20' @@ -46,7 +46,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Node - uses: actions/setup-node@v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 with: node-version: '20' @@ -83,7 +83,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Node - uses: actions/setup-node@v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 with: node-version: '20' diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index ffacf56..567dfb1 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Node - uses: actions/setup-node@v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 with: node-version: '20' From dfe77774243676d933d507ffd56767c7286cf812 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 27 May 2026 02:48:54 +0000 Subject: [PATCH 5/5] release: 0.29.1 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- src/version.ts | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 8316a6d..712789e 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.29.0" + ".": "0.29.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fb2720..43f1303 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 0.29.1 (2026-05-27) + +Full Changelog: [v0.29.0...v0.29.1](https://github.com/perplexityai/perplexity-node/compare/v0.29.0...v0.29.1) + +### Bug Fixes + +* **streaming:** yield named SSE events for responses.create + discriminate ResponseStreamEvent union ([db5ce72](https://github.com/perplexityai/perplexity-node/commit/db5ce72dabb755406bf3f8b21e7d9c85c257f1a2)) +* **typescript:** upgrade tsc-multi so that it works with Node 26 ([5c5edbe](https://github.com/perplexityai/perplexity-node/commit/5c5edbefd4a8bb3b855cf16b68ea257c477cfede)) + + +### Chores + +* **tests:** remove redundant File import ([b6474ba](https://github.com/perplexityai/perplexity-node/commit/b6474bae54ac5d5f404da8daaffa2c96c9d801bb)) + ## 0.29.0 (2026-05-13) Full Changelog: [v0.28.0...v0.29.0](https://github.com/perplexityai/perplexity-node/compare/v0.28.0...v0.29.0) diff --git a/package.json b/package.json index d704f60..4111570 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@perplexity-ai/perplexity_ai", - "version": "0.29.0", + "version": "0.29.1", "description": "The official TypeScript library for the Perplexity API", "author": "Perplexity ", "types": "dist/index.d.ts", diff --git a/src/version.ts b/src/version.ts index bef2b64..b8b7a27 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.29.0'; // x-release-please-version +export const VERSION = '0.29.1'; // x-release-please-version