From b80d125781682aa3d65416ca6e106d38d20fc554 Mon Sep 17 00:00:00 2001 From: Saleh Alghusson Date: Tue, 13 Oct 2026 13:25:02 +0000 Subject: [PATCH 1/3] fix: support Agent cache controls and extraction usage --- src/generated/api.ts | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/generated/api.ts b/src/generated/api.ts index b234a51..312cbc5 100644 --- a/src/generated/api.ts +++ b/src/generated/api.ts @@ -876,12 +876,12 @@ export type InputItemOutput = InputMessageOutput | FunctionCallOutputInputOutput export type InputMessageInput = { content: InputContentInput; role: "user" | "assistant" | "system" | "developer"; - type: "message"; + type?: "message"; }; export type InputMessageOutput = { content: InputContentOutput; role: "user" | "assistant" | "system" | "developer"; - type: "message"; + type?: "message"; }; export type JSONSchemaInput = { description?: string | null; @@ -1401,8 +1401,10 @@ export type ResponsesRequestInput = { preset?: string; previous_response_id?: string; profile?: ProfileReferenceInput; + prompt_cache_key?: string; reasoning?: ReasoningConfigInput; response_format?: ResponseFormatInput; + service_tier?: "auto" | "default" | "flex" | "priority" | "fast"; skills?: SkillInput[]; store?: boolean; stream?: boolean; @@ -1423,8 +1425,10 @@ export type ResponsesRequestOutput = { preset?: string; previous_response_id?: string; profile?: ProfileReferenceOutput; + prompt_cache_key?: string; reasoning?: ReasoningConfigOutput; response_format?: ResponseFormatOutput; + service_tier?: "auto" | "default" | "flex" | "priority" | "fast"; skills?: SkillOutput[]; store?: boolean; stream?: boolean; @@ -1442,6 +1446,8 @@ export type ResponsesResponseInput = { object: ResponsesObjectTypeInput; output: OutputItemInput[]; previous_response_id?: string | null; + prompt_cache_key?: string | null; + service_tier?: string; status: StatusInput; store?: boolean; usage?: ResponsesUsageInput; @@ -1455,6 +1461,8 @@ export type ResponsesResponseOutput = { object: ResponsesObjectTypeOutput; output: OutputItemOutput[]; previous_response_id?: string | null; + prompt_cache_key?: string | null; + service_tier?: string; status: StatusOutput; store?: boolean; usage?: ResponsesUsageOutput; @@ -1756,10 +1764,14 @@ export type ToolCallOutput = { type?: "function" | null; }; export type ToolCallDetailsInput = { + cost_usd?: number; invocation?: number; + token_usage?: ToolCallTokenUsageInput[]; }; export type ToolCallDetailsOutput = { + cost_usd?: number; invocation?: number; + token_usage?: ToolCallTokenUsageOutput[]; }; export type ToolCallFunctionInput = { arguments?: string | null; @@ -1769,6 +1781,32 @@ export type ToolCallFunctionOutput = { arguments?: string | null; name?: string | null; }; +export type ToolCallTokenUsageInput = { + input_tokens: number; + input_tokens_details: { + cache_creation_input_tokens?: number; + cache_read_input_tokens?: number; + cached_tokens: number; + }; + model?: string; + output_tokens: number; + output_tokens_details: { + reasoning_tokens: number; + }; +}; +export type ToolCallTokenUsageOutput = { + input_tokens: number; + input_tokens_details: { + cache_creation_input_tokens?: number; + cache_read_input_tokens?: number; + cached_tokens: number; + }; + model?: string; + output_tokens: number; + output_tokens_details: { + reasoning_tokens: number; + }; +}; export type ToolChoiceInput = ("none" | "auto" | "required") | ({} & Record); export type ToolChoiceOutput = ("none" | "auto" | "required") | ({} & Record); export type ToolSearchOutputItemInput = { From 70209853ca88c9c3cfb951ab2f0f8493ddc83ed6 Mon Sep 17 00:00:00 2001 From: Saleh Alghusson Date: Tue, 13 Oct 2026 13:41:36 +0000 Subject: [PATCH 2/3] refactor: name tool usage detail types --- src/generated/api.ts | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/generated/api.ts b/src/generated/api.ts index 312cbc5..bf0d29b 100644 --- a/src/generated/api.ts +++ b/src/generated/api.ts @@ -883,6 +883,16 @@ export type InputMessageOutput = { role: "user" | "assistant" | "system" | "developer"; type?: "message"; }; +export type InputTokensDetailsInput = { + cache_creation_input_tokens?: number; + cache_read_input_tokens?: number; + cached_tokens: number; +}; +export type InputTokensDetailsOutput = { + cache_creation_input_tokens?: number; + cache_read_input_tokens?: number; + cached_tokens: number; +}; export type JSONSchemaInput = { description?: string | null; name?: string | null; @@ -1139,6 +1149,12 @@ export type OutputItemDoneEventOutput = { sequence_number: number; type: "response.output_item.done"; }; +export type OutputTokensDetailsInput = { + reasoning_tokens: number; +}; +export type OutputTokensDetailsOutput = { + reasoning_tokens: number; +}; export type ParameterSpecInput = { additional_properties?: boolean | null; properties: {} & Record; @@ -1783,29 +1799,17 @@ export type ToolCallFunctionOutput = { }; export type ToolCallTokenUsageInput = { input_tokens: number; - input_tokens_details: { - cache_creation_input_tokens?: number; - cache_read_input_tokens?: number; - cached_tokens: number; - }; + input_tokens_details: InputTokensDetailsInput; model?: string; output_tokens: number; - output_tokens_details: { - reasoning_tokens: number; - }; + output_tokens_details: OutputTokensDetailsInput; }; export type ToolCallTokenUsageOutput = { input_tokens: number; - input_tokens_details: { - cache_creation_input_tokens?: number; - cache_read_input_tokens?: number; - cached_tokens: number; - }; + input_tokens_details: InputTokensDetailsOutput; model?: string; output_tokens: number; - output_tokens_details: { - reasoning_tokens: number; - }; + output_tokens_details: OutputTokensDetailsOutput; }; export type ToolChoiceInput = ("none" | "auto" | "required") | ({} & Record); export type ToolChoiceOutput = ("none" | "auto" | "required") | ({} & Record); From 24b7e308f63931fd20a1a1391362e7958396c436 Mon Sep 17 00:00:00 2001 From: Saleh Alghusson Date: Wed, 14 Oct 2026 18:42:12 +0000 Subject: [PATCH 3/3] test: cover Agent cache controls and extraction usage --- src/test/resources/responses/BUILD.bazel | 1 + .../resources/responses/cache-usage.test.ts | 61 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/test/resources/responses/cache-usage.test.ts diff --git a/src/test/resources/responses/BUILD.bazel b/src/test/resources/responses/BUILD.bazel index d5978ab..eefb372 100644 --- a/src/test/resources/responses/BUILD.bazel +++ b/src/test/resources/responses/BUILD.bazel @@ -3,6 +3,7 @@ load("//:ts.bzl", "ts_test") ts_test( name = "responses_test", srcs = [ + "cache-usage.test.ts", "files.test.ts", "responses.test.ts", ], diff --git a/src/test/resources/responses/cache-usage.test.ts b/src/test/resources/responses/cache-usage.test.ts new file mode 100644 index 0000000..e7fe339 --- /dev/null +++ b/src/test/resources/responses/cache-usage.test.ts @@ -0,0 +1,61 @@ +import assert from 'node:assert/strict'; +import { it } from 'node:test'; +import Perplexity from '../../../index.js'; + +it('sends cache controls and parses extraction usage', async () => { + const client = new Perplexity({ + apiKey: 'test', + baseURL: 'https://example.test', + fetch: async (input, init) => { + const request = new Request(input, init); + assert.equal(request.url, 'https://example.test/v1/responses'); + assert.deepEqual(await request.json(), { + input: [{ role: 'user', content: 'Summarize the file.' }], + service_tier: 'priority', + prompt_cache_key: 'doc-1', + }); + return Response.json({ + id: 'resp-1', + object: 'response', + created_at: 0, + model: 'openai/gpt-5.4', + status: 'completed', + output: [], + service_tier: 'priority', + prompt_cache_key: 'doc-1', + usage: { + input_tokens: 10, + output_tokens: 2, + total_tokens: 12, + tool_calls_details: { + fetch_url: { + invocation: 1, + cost_usd: 0.0025, + token_usage: [ + { + model: 'extractor', + input_tokens: 100, + input_tokens_details: { cached_tokens: 40, cache_read_input_tokens: 40 }, + output_tokens: 20, + output_tokens_details: { reasoning_tokens: 5 }, + }, + ], + }, + }, + }, + }); + }, + }); + const response = await client.responses.create({ + input: [{ role: 'user', content: 'Summarize the file.' }], + service_tier: 'priority', + prompt_cache_key: 'doc-1', + }); + assert.equal(response.service_tier, 'priority'); + assert.equal(response.prompt_cache_key, 'doc-1'); + const details = response.usage?.tool_calls_details?.['fetch_url']; + assert.equal(details?.cost_usd, 0.0025); + const usage = details?.token_usage?.[0]; + assert.equal(usage?.input_tokens_details.cache_read_input_tokens, 40); + assert.equal(usage?.output_tokens_details.reasoning_tokens, 5); +});