diff --git a/src/integration/chat.test.ts b/src/integration/chat.test.ts index 3c1d533..ad7d575 100644 --- a/src/integration/chat.test.ts +++ b/src/integration/chat.test.ts @@ -61,6 +61,11 @@ describe('Requesty Integration - Chat', () => { inputTokens: 10, outputTokens: 9, totalTokens: 19, + raw: { + prompt_tokens: 10, + completion_tokens: 9, + total_tokens: 19, + }, }) }) diff --git a/src/requesty-chat-language-model.ts b/src/requesty-chat-language-model.ts index 4929a0d..26aec59 100644 --- a/src/requesty-chat-language-model.ts +++ b/src/requesty-chat-language-model.ts @@ -205,20 +205,27 @@ export class RequestyChatLanguageModel implements LanguageModelV2 { throw new Error('No choice in response') } - const providerMetadata = response.usage?.prompt_tokens_details - ? ({ - requesty: { - usage: { - cachingTokens: - response.usage.prompt_tokens_details - .caching_tokens ?? 0, - cachedTokens: - response.usage.prompt_tokens_details - .cached_tokens ?? 0, + const hasPromptTokensDetails = response.usage?.prompt_tokens_details + const hasCost = response.usage?.cost != null + + const providerMetadata = + hasPromptTokensDetails || hasCost + ? ({ + requesty: { + usage: { + cachingTokens: + response.usage?.prompt_tokens_details + ?.caching_tokens ?? 0, + cachedTokens: + response.usage?.prompt_tokens_details + ?.cached_tokens ?? 0, + ...(hasCost + ? { cost: response.usage!.cost } + : {}), + }, }, - }, - } satisfies SharedV2ProviderMetadata) - : undefined + } satisfies SharedV2ProviderMetadata) + : undefined // Convert to content format const content: Array = [] @@ -428,6 +435,7 @@ export const RequestyStreamChatCompletionChunkSchema = z.object({ cached_tokens: z.number().optional(), }) .optional(), + cost: z.number().optional(), }) .optional(), error: z.any().optional(), diff --git a/src/stream/index.ts b/src/stream/index.ts index 4e0862f..e1e57bb 100644 --- a/src/stream/index.ts +++ b/src/stream/index.ts @@ -36,6 +36,7 @@ function handleUsageChunk( const requestyUsage: Partial = { cachingTokens: usage.prompt_tokens_details?.caching_tokens ?? 0, + ...(usage.cost != null ? { cost: usage.cost } : {}), } return [modelUsage, requestyUsage] @@ -307,14 +308,17 @@ export const createFlush = ({ const providerMetadata: SharedV2ProviderMetadata = { requesty: { usage: - currentRequestyUsage.cachedTokens && - currentRequestyUsage.cachingTokens + currentRequestyUsage.cachedTokens || + currentRequestyUsage.cachingTokens || + currentRequestyUsage.cost != null ? currentRequestyUsage : {}, }, } - const hasProviderMetadata = providerMetadata.requesty?.usage + const hasProviderMetadata = + providerMetadata.requesty?.usage && + Object.keys(providerMetadata.requesty.usage).length > 0 const currentFinishReason = finishReason.get() const currentUsage = usage.get() diff --git a/src/types.ts b/src/types.ts index 29c21d0..32f8675 100644 --- a/src/types.ts +++ b/src/types.ts @@ -42,6 +42,7 @@ export type RequestySharedSettings = RequestyProviderOptions & { export type RequestyUsage = { cachingTokens?: number cachedTokens?: number + cost?: number } export type RequestyProviderMetadata = {