@absolutejs/voice 0.0.22-beta.615 → 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,30 +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;
47
- provider?: string;
57
+ byProvider: VoiceCostProviderSlice[];
48
58
  usd: number;
49
59
  };
50
60
  sessionId?: string;
51
61
  stt: {
52
62
  audioMs: number;
53
- provider?: string;
63
+ byProvider: VoiceCostProviderSlice[];
54
64
  usd: number;
55
65
  };
56
66
  telephony: {
57
67
  minutes: number;
58
- provider?: string;
68
+ byProvider: VoiceCostProviderSlice[];
59
69
  usd: number;
60
70
  };
61
71
  totalUsd: number;
62
72
  tts: {
63
73
  audioMs: number;
64
74
  characters: number;
65
- provider?: string;
75
+ byProvider: VoiceCostProviderSlice[];
66
76
  usd: number;
67
77
  };
68
78
  };
package/dist/index.js CHANGED
@@ -41866,30 +41866,20 @@ var createVoiceCostAccountant = (options = {}) => {
41866
41866
  let sttUsd = 0;
41867
41867
  let telephonyMinutes = 0;
41868
41868
  let telephonyUsd = 0;
41869
- const llmByProvider = new Map;
41870
- const ttsByProvider = new Map;
41871
- const sttByProvider = new Map;
41872
- const telephonyByProvider = new Map;
41873
- let lastLlmProvider;
41874
- let lastTtsProvider;
41875
- let lastSttProvider;
41876
- let lastTelephonyProvider;
41877
- const addProvider = (byProvider, provider, usd) => {
41878
- if (!provider)
41879
- return;
41880
- byProvider.set(provider, (byProvider.get(provider) ?? 0) + usd);
41881
- };
41882
- const dominant = (byProvider, fallback) => {
41883
- let best;
41884
- let bestUsd = -1;
41885
- for (const [provider, usd] of byProvider) {
41886
- if (usd > bestUsd) {
41887
- bestUsd = usd;
41888
- best = provider;
41889
- }
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);
41890
41878
  }
41891
- return best ?? fallback;
41879
+ return slice;
41892
41880
  };
41881
+ const round6 = (value) => Math.round(value * 1e6) / 1e6;
41882
+ const finalizeSlices = (slices) => [...slices.values()].map((slice) => ({ ...slice, usd: round6(slice.usd) }));
41893
41883
  return {
41894
41884
  recordLLM: (usage) => {
41895
41885
  const input = usage.inputTokens ?? 0;
@@ -41898,86 +41888,98 @@ var createVoiceCostAccountant = (options = {}) => {
41898
41888
  llmInput += input;
41899
41889
  llmCachedInput += cached;
41900
41890
  llmOutput += output;
41901
- if (usage.provider)
41902
- lastLlmProvider = usage.provider;
41903
41891
  const rates = lookupRates(priceBook, usage.provider, usage.model)?.llm;
41904
- if (!rates) {
41905
- 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;
41906
41904
  }
41907
- const cachedRate = rates.cachedInputPerMillionTokensUsd ?? rates.inputPerMillionTokensUsd;
41908
- const delta = Math.max(0, input - cached) * rates.inputPerMillionTokensUsd / 1e6 + cached * cachedRate / 1e6 + output * rates.outputPerMillionTokensUsd / 1e6;
41909
- llmUsd += delta;
41910
- addProvider(llmByProvider, usage.provider, delta);
41911
41905
  },
41912
41906
  recordSTT: (input) => {
41913
- sttAudioMs += Math.max(0, input.audioMs);
41914
- if (input.provider)
41915
- lastSttProvider = input.provider;
41907
+ const audioMs = Math.max(0, input.audioMs);
41908
+ sttAudioMs += audioMs;
41916
41909
  const rates = lookupRates(priceBook, input.provider, input.model)?.stt;
41917
- if (!rates) {
41918
- 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;
41919
41919
  }
41920
- const delta = Math.max(0, input.audioMs) / 1000 * rates.perSecondUsd;
41921
- sttUsd += delta;
41922
- addProvider(sttByProvider, input.provider, delta);
41923
41920
  },
41924
41921
  recordTelephony: (input) => {
41925
- telephonyMinutes += Math.max(0, input.minutes);
41926
- if (input.provider)
41927
- lastTelephonyProvider = input.provider;
41922
+ const minutes = Math.max(0, input.minutes);
41923
+ telephonyMinutes += minutes;
41928
41924
  const rates = lookupRates(priceBook, input.provider)?.telephony;
41929
- if (!rates) {
41930
- 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;
41931
41934
  }
41932
- const delta = Math.max(0, input.minutes) * rates.perMinuteUsd;
41933
- telephonyUsd += delta;
41934
- addProvider(telephonyByProvider, input.provider, delta);
41935
41935
  },
41936
41936
  recordTTS: (input) => {
41937
41937
  const chars = input.characters ?? 0;
41938
41938
  const audioMs = input.audioMs ?? 0;
41939
41939
  ttsCharacters += chars;
41940
41940
  ttsAudioMs += audioMs;
41941
- if (input.provider)
41942
- lastTtsProvider = input.provider;
41943
41941
  const rates = lookupRates(priceBook, input.provider, input.voice)?.tts;
41944
- if (!rates) {
41945
- return;
41946
- }
41947
41942
  let delta = 0;
41948
- if (rates.perMillionCharactersUsd !== undefined && chars > 0) {
41949
- delta = chars * rates.perMillionCharactersUsd / 1e6;
41950
- } else if (rates.perSecondUsd !== undefined && audioMs > 0) {
41951
- delta = audioMs / 1000 * rates.perSecondUsd;
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;
41950
+ }
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;
41952
41956
  }
41953
- ttsUsd += delta;
41954
- addProvider(ttsByProvider, input.provider, delta);
41955
41957
  },
41956
41958
  snapshot: () => ({
41957
41959
  llm: {
41960
+ byProvider: finalizeSlices(llmSlices),
41958
41961
  cachedInputTokens: llmCachedInput,
41959
41962
  inputTokens: llmInput,
41960
41963
  outputTokens: llmOutput,
41961
- provider: dominant(llmByProvider, lastLlmProvider),
41962
- usd: Math.round(llmUsd * 1e6) / 1e6
41964
+ usd: round6(llmUsd)
41963
41965
  },
41964
41966
  sessionId: options.sessionId,
41965
41967
  stt: {
41966
41968
  audioMs: sttAudioMs,
41967
- provider: dominant(sttByProvider, lastSttProvider),
41968
- usd: Math.round(sttUsd * 1e6) / 1e6
41969
+ byProvider: finalizeSlices(sttSlices),
41970
+ usd: round6(sttUsd)
41969
41971
  },
41970
41972
  telephony: {
41973
+ byProvider: finalizeSlices(telephonySlices),
41971
41974
  minutes: telephonyMinutes,
41972
- provider: dominant(telephonyByProvider, lastTelephonyProvider),
41973
- usd: Math.round(telephonyUsd * 1e6) / 1e6
41975
+ usd: round6(telephonyUsd)
41974
41976
  },
41975
- totalUsd: Math.round((llmUsd + ttsUsd + sttUsd + telephonyUsd) * 1e6) / 1e6,
41977
+ totalUsd: round6(llmUsd + ttsUsd + sttUsd + telephonyUsd),
41976
41978
  tts: {
41977
41979
  audioMs: ttsAudioMs,
41980
+ byProvider: finalizeSlices(ttsSlices),
41978
41981
  characters: ttsCharacters,
41979
- provider: dominant(ttsByProvider, lastTtsProvider),
41980
- usd: Math.round(ttsUsd * 1e6) / 1e6
41982
+ usd: round6(ttsUsd)
41981
41983
  }
41982
41984
  })
41983
41985
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.615",
3
+ "version": "0.0.22-beta.616",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",