@absolutejs/voice 0.0.22-beta.614 → 0.0.22-beta.616

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -39,26 +39,40 @@ export type VoiceCostTelephonyRecord = {
39
39
  minutes: number;
40
40
  provider?: string;
41
41
  };
42
+ export type VoiceCostProviderSlice = {
43
+ provider: string;
44
+ usd: number;
45
+ cachedInputTokens?: number;
46
+ inputTokens?: number;
47
+ outputTokens?: number;
48
+ characters?: number;
49
+ audioMs?: number;
50
+ minutes?: number;
51
+ };
42
52
  export type VoiceCostBreakdown = {
43
53
  llm: {
44
54
  cachedInputTokens: number;
45
55
  inputTokens: number;
46
56
  outputTokens: number;
57
+ byProvider: VoiceCostProviderSlice[];
47
58
  usd: number;
48
59
  };
49
60
  sessionId?: string;
50
61
  stt: {
51
62
  audioMs: number;
63
+ byProvider: VoiceCostProviderSlice[];
52
64
  usd: number;
53
65
  };
54
66
  telephony: {
55
67
  minutes: number;
68
+ byProvider: VoiceCostProviderSlice[];
56
69
  usd: number;
57
70
  };
58
71
  totalUsd: number;
59
72
  tts: {
60
73
  audioMs: number;
61
74
  characters: number;
75
+ byProvider: VoiceCostProviderSlice[];
62
76
  usd: number;
63
77
  };
64
78
  };
package/dist/index.js CHANGED
@@ -41866,6 +41866,20 @@ var createVoiceCostAccountant = (options = {}) => {
41866
41866
  let sttUsd = 0;
41867
41867
  let telephonyMinutes = 0;
41868
41868
  let telephonyUsd = 0;
41869
+ const llmSlices = new Map;
41870
+ const ttsSlices = new Map;
41871
+ const sttSlices = new Map;
41872
+ const telephonySlices = new Map;
41873
+ const sliceFor = (slices, provider) => {
41874
+ let slice = slices.get(provider);
41875
+ if (!slice) {
41876
+ slice = { provider, usd: 0 };
41877
+ slices.set(provider, slice);
41878
+ }
41879
+ return slice;
41880
+ };
41881
+ const round6 = (value) => Math.round(value * 1e6) / 1e6;
41882
+ const finalizeSlices = (slices) => [...slices.values()].map((slice) => ({ ...slice, usd: round6(slice.usd) }));
41869
41883
  return {
41870
41884
  recordLLM: (usage) => {
41871
41885
  const input = usage.inputTokens ?? 0;
@@ -41875,27 +41889,49 @@ var createVoiceCostAccountant = (options = {}) => {
41875
41889
  llmCachedInput += cached;
41876
41890
  llmOutput += output;
41877
41891
  const rates = lookupRates(priceBook, usage.provider, usage.model)?.llm;
41878
- if (!rates) {
41879
- return;
41892
+ let delta = 0;
41893
+ if (rates) {
41894
+ const cachedRate = rates.cachedInputPerMillionTokensUsd ?? rates.inputPerMillionTokensUsd;
41895
+ delta = Math.max(0, input - cached) * rates.inputPerMillionTokensUsd / 1e6 + cached * cachedRate / 1e6 + output * rates.outputPerMillionTokensUsd / 1e6;
41896
+ llmUsd += delta;
41897
+ }
41898
+ if (usage.provider) {
41899
+ const slice = sliceFor(llmSlices, usage.provider);
41900
+ slice.usd += delta;
41901
+ slice.inputTokens = (slice.inputTokens ?? 0) + input;
41902
+ slice.outputTokens = (slice.outputTokens ?? 0) + output;
41903
+ slice.cachedInputTokens = (slice.cachedInputTokens ?? 0) + cached;
41880
41904
  }
41881
- const cachedRate = rates.cachedInputPerMillionTokensUsd ?? rates.inputPerMillionTokensUsd;
41882
- llmUsd += Math.max(0, input - cached) * rates.inputPerMillionTokensUsd / 1e6 + cached * cachedRate / 1e6 + output * rates.outputPerMillionTokensUsd / 1e6;
41883
41905
  },
41884
41906
  recordSTT: (input) => {
41885
- sttAudioMs += Math.max(0, input.audioMs);
41907
+ const audioMs = Math.max(0, input.audioMs);
41908
+ sttAudioMs += audioMs;
41886
41909
  const rates = lookupRates(priceBook, input.provider, input.model)?.stt;
41887
- if (!rates) {
41888
- return;
41910
+ let delta = 0;
41911
+ if (rates) {
41912
+ delta = audioMs / 1000 * rates.perSecondUsd;
41913
+ sttUsd += delta;
41914
+ }
41915
+ if (input.provider) {
41916
+ const slice = sliceFor(sttSlices, input.provider);
41917
+ slice.usd += delta;
41918
+ slice.audioMs = (slice.audioMs ?? 0) + audioMs;
41889
41919
  }
41890
- sttUsd += Math.max(0, input.audioMs) / 1000 * rates.perSecondUsd;
41891
41920
  },
41892
41921
  recordTelephony: (input) => {
41893
- telephonyMinutes += Math.max(0, input.minutes);
41922
+ const minutes = Math.max(0, input.minutes);
41923
+ telephonyMinutes += minutes;
41894
41924
  const rates = lookupRates(priceBook, input.provider)?.telephony;
41895
- if (!rates) {
41896
- return;
41925
+ let delta = 0;
41926
+ if (rates) {
41927
+ delta = minutes * rates.perMinuteUsd;
41928
+ telephonyUsd += delta;
41929
+ }
41930
+ if (input.provider) {
41931
+ const slice = sliceFor(telephonySlices, input.provider);
41932
+ slice.usd += delta;
41933
+ slice.minutes = (slice.minutes ?? 0) + minutes;
41897
41934
  }
41898
- telephonyUsd += Math.max(0, input.minutes) * rates.perMinuteUsd;
41899
41935
  },
41900
41936
  recordTTS: (input) => {
41901
41937
  const chars = input.characters ?? 0;
@@ -41903,36 +41939,47 @@ var createVoiceCostAccountant = (options = {}) => {
41903
41939
  ttsCharacters += chars;
41904
41940
  ttsAudioMs += audioMs;
41905
41941
  const rates = lookupRates(priceBook, input.provider, input.voice)?.tts;
41906
- if (!rates) {
41907
- return;
41942
+ let delta = 0;
41943
+ if (rates) {
41944
+ if (rates.perMillionCharactersUsd !== undefined && chars > 0) {
41945
+ delta = chars * rates.perMillionCharactersUsd / 1e6;
41946
+ } else if (rates.perSecondUsd !== undefined && audioMs > 0) {
41947
+ delta = audioMs / 1000 * rates.perSecondUsd;
41948
+ }
41949
+ ttsUsd += delta;
41908
41950
  }
41909
- if (rates.perMillionCharactersUsd !== undefined && chars > 0) {
41910
- ttsUsd += chars * rates.perMillionCharactersUsd / 1e6;
41911
- } else if (rates.perSecondUsd !== undefined && audioMs > 0) {
41912
- ttsUsd += audioMs / 1000 * rates.perSecondUsd;
41951
+ if (input.provider) {
41952
+ const slice = sliceFor(ttsSlices, input.provider);
41953
+ slice.usd += delta;
41954
+ slice.characters = (slice.characters ?? 0) + chars;
41955
+ slice.audioMs = (slice.audioMs ?? 0) + audioMs;
41913
41956
  }
41914
41957
  },
41915
41958
  snapshot: () => ({
41916
41959
  llm: {
41960
+ byProvider: finalizeSlices(llmSlices),
41917
41961
  cachedInputTokens: llmCachedInput,
41918
41962
  inputTokens: llmInput,
41919
41963
  outputTokens: llmOutput,
41920
- usd: Math.round(llmUsd * 1e6) / 1e6
41964
+ usd: round6(llmUsd)
41921
41965
  },
41922
41966
  sessionId: options.sessionId,
41923
41967
  stt: {
41924
41968
  audioMs: sttAudioMs,
41925
- usd: Math.round(sttUsd * 1e6) / 1e6
41969
+ byProvider: finalizeSlices(sttSlices),
41970
+ usd: round6(sttUsd)
41926
41971
  },
41927
41972
  telephony: {
41973
+ byProvider: finalizeSlices(telephonySlices),
41928
41974
  minutes: telephonyMinutes,
41929
- usd: Math.round(telephonyUsd * 1e6) / 1e6
41975
+ usd: round6(telephonyUsd)
41930
41976
  },
41931
- totalUsd: Math.round((llmUsd + ttsUsd + sttUsd + telephonyUsd) * 1e6) / 1e6,
41977
+ totalUsd: round6(llmUsd + ttsUsd + sttUsd + telephonyUsd),
41932
41978
  tts: {
41933
41979
  audioMs: ttsAudioMs,
41980
+ byProvider: finalizeSlices(ttsSlices),
41934
41981
  characters: ttsCharacters,
41935
- usd: Math.round(ttsUsd * 1e6) / 1e6
41982
+ usd: round6(ttsUsd)
41936
41983
  }
41937
41984
  })
41938
41985
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.614",
3
+ "version": "0.0.22-beta.616",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",