@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.
- package/dist/core/costAccounting.d.ts +14 -4
- package/dist/index.js +68 -66
- package/package.json +1 -1
|
@@ -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
|
-
|
|
57
|
+
byProvider: VoiceCostProviderSlice[];
|
|
48
58
|
usd: number;
|
|
49
59
|
};
|
|
50
60
|
sessionId?: string;
|
|
51
61
|
stt: {
|
|
52
62
|
audioMs: number;
|
|
53
|
-
|
|
63
|
+
byProvider: VoiceCostProviderSlice[];
|
|
54
64
|
usd: number;
|
|
55
65
|
};
|
|
56
66
|
telephony: {
|
|
57
67
|
minutes: number;
|
|
58
|
-
|
|
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
|
-
|
|
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
|
|
41870
|
-
const
|
|
41871
|
-
const
|
|
41872
|
-
const
|
|
41873
|
-
|
|
41874
|
-
|
|
41875
|
-
|
|
41876
|
-
|
|
41877
|
-
|
|
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
|
|
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
|
-
|
|
41905
|
-
|
|
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
|
-
|
|
41914
|
-
|
|
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
|
-
|
|
41918
|
-
|
|
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
|
-
|
|
41926
|
-
|
|
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
|
-
|
|
41930
|
-
|
|
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
|
|
41949
|
-
|
|
41950
|
-
|
|
41951
|
-
|
|
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
|
-
|
|
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
|
-
|
|
41968
|
-
usd:
|
|
41969
|
+
byProvider: finalizeSlices(sttSlices),
|
|
41970
|
+
usd: round6(sttUsd)
|
|
41969
41971
|
},
|
|
41970
41972
|
telephony: {
|
|
41973
|
+
byProvider: finalizeSlices(telephonySlices),
|
|
41971
41974
|
minutes: telephonyMinutes,
|
|
41972
|
-
|
|
41973
|
-
usd: Math.round(telephonyUsd * 1e6) / 1e6
|
|
41975
|
+
usd: round6(telephonyUsd)
|
|
41974
41976
|
},
|
|
41975
|
-
totalUsd:
|
|
41977
|
+
totalUsd: round6(llmUsd + ttsUsd + sttUsd + telephonyUsd),
|
|
41976
41978
|
tts: {
|
|
41977
41979
|
audioMs: ttsAudioMs,
|
|
41980
|
+
byProvider: finalizeSlices(ttsSlices),
|
|
41978
41981
|
characters: ttsCharacters,
|
|
41979
|
-
|
|
41980
|
-
usd: Math.round(ttsUsd * 1e6) / 1e6
|
|
41982
|
+
usd: round6(ttsUsd)
|
|
41981
41983
|
}
|
|
41982
41984
|
})
|
|
41983
41985
|
};
|