@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.
- package/dist/core/costAccounting.d.ts +14 -0
- package/dist/index.js +70 -23
- package/package.json +1 -1
|
@@ -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
|
-
|
|
41879
|
-
|
|
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
|
-
|
|
41907
|
+
const audioMs = Math.max(0, input.audioMs);
|
|
41908
|
+
sttAudioMs += audioMs;
|
|
41886
41909
|
const rates = lookupRates(priceBook, input.provider, input.model)?.stt;
|
|
41887
|
-
|
|
41888
|
-
|
|
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
|
-
|
|
41922
|
+
const minutes = Math.max(0, input.minutes);
|
|
41923
|
+
telephonyMinutes += minutes;
|
|
41894
41924
|
const rates = lookupRates(priceBook, input.provider)?.telephony;
|
|
41895
|
-
|
|
41896
|
-
|
|
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
|
-
|
|
41907
|
-
|
|
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 (
|
|
41910
|
-
|
|
41911
|
-
|
|
41912
|
-
|
|
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:
|
|
41964
|
+
usd: round6(llmUsd)
|
|
41921
41965
|
},
|
|
41922
41966
|
sessionId: options.sessionId,
|
|
41923
41967
|
stt: {
|
|
41924
41968
|
audioMs: sttAudioMs,
|
|
41925
|
-
|
|
41969
|
+
byProvider: finalizeSlices(sttSlices),
|
|
41970
|
+
usd: round6(sttUsd)
|
|
41926
41971
|
},
|
|
41927
41972
|
telephony: {
|
|
41973
|
+
byProvider: finalizeSlices(telephonySlices),
|
|
41928
41974
|
minutes: telephonyMinutes,
|
|
41929
|
-
usd:
|
|
41975
|
+
usd: round6(telephonyUsd)
|
|
41930
41976
|
},
|
|
41931
|
-
totalUsd:
|
|
41977
|
+
totalUsd: round6(llmUsd + ttsUsd + sttUsd + telephonyUsd),
|
|
41932
41978
|
tts: {
|
|
41933
41979
|
audioMs: ttsAudioMs,
|
|
41980
|
+
byProvider: finalizeSlices(ttsSlices),
|
|
41934
41981
|
characters: ttsCharacters,
|
|
41935
|
-
usd:
|
|
41982
|
+
usd: round6(ttsUsd)
|
|
41936
41983
|
}
|
|
41937
41984
|
})
|
|
41938
41985
|
};
|