diff --git a/src/generated/api.ts b/src/generated/api.ts index b234a51..bf0d29b 100644 --- a/src/generated/api.ts +++ b/src/generated/api.ts @@ -876,12 +876,22 @@ 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 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; @@ -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; @@ -1401,8 +1417,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 +1441,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 +1462,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 +1477,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 +1780,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 +1797,20 @@ export type ToolCallFunctionOutput = { arguments?: string | null; name?: string | null; }; +export type ToolCallTokenUsageInput = { + input_tokens: number; + input_tokens_details: InputTokensDetailsInput; + model?: string; + output_tokens: number; + output_tokens_details: OutputTokensDetailsInput; +}; +export type ToolCallTokenUsageOutput = { + input_tokens: number; + input_tokens_details: InputTokensDetailsOutput; + model?: string; + output_tokens: number; + output_tokens_details: OutputTokensDetailsOutput; +}; export type ToolChoiceInput = ("none" | "auto" | "required") | ({} & Record); export type ToolChoiceOutput = ("none" | "auto" | "required") | ({} & Record); export type ToolSearchOutputItemInput = { 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); +});