@cartanova/qgrid-cli 2.2.0 → 2.2.1
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.
|
@@ -1,30 +1,38 @@
|
|
|
1
1
|
import "../../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
//#region src/utils/providers/common/model-cost.ts
|
|
3
|
+
const LONG_CONTEXT_272K = {
|
|
4
|
+
threshold: 272e3,
|
|
5
|
+
inputMultiplier: 2,
|
|
6
|
+
cachedInputMultiplier: 2,
|
|
7
|
+
outputMultiplier: 1.5
|
|
8
|
+
};
|
|
3
9
|
const OPENAI_COSTS = {
|
|
4
10
|
"gpt-5.5": {
|
|
5
|
-
inputTokens:
|
|
6
|
-
outputTokens:
|
|
7
|
-
cachedInputTokens: .5
|
|
11
|
+
inputTokens: 5,
|
|
12
|
+
outputTokens: 30,
|
|
13
|
+
cachedInputTokens: .5,
|
|
14
|
+
longContext: LONG_CONTEXT_272K
|
|
8
15
|
},
|
|
9
16
|
"gpt-5.4": {
|
|
10
|
-
inputTokens: 2,
|
|
11
|
-
outputTokens:
|
|
12
|
-
cachedInputTokens: .
|
|
17
|
+
inputTokens: 2.5,
|
|
18
|
+
outputTokens: 15,
|
|
19
|
+
cachedInputTokens: .25,
|
|
20
|
+
longContext: LONG_CONTEXT_272K
|
|
13
21
|
},
|
|
14
22
|
"gpt-5.4-mini": {
|
|
15
|
-
inputTokens: .
|
|
16
|
-
outputTokens:
|
|
17
|
-
cachedInputTokens: .
|
|
23
|
+
inputTokens: .75,
|
|
24
|
+
outputTokens: 4.5,
|
|
25
|
+
cachedInputTokens: .075
|
|
18
26
|
},
|
|
19
27
|
"gpt-5.3-codex": {
|
|
20
|
-
inputTokens:
|
|
21
|
-
outputTokens:
|
|
22
|
-
cachedInputTokens: .
|
|
28
|
+
inputTokens: 1.75,
|
|
29
|
+
outputTokens: 14,
|
|
30
|
+
cachedInputTokens: .175
|
|
23
31
|
},
|
|
24
32
|
"gpt-5.2": {
|
|
25
|
-
inputTokens:
|
|
26
|
-
outputTokens:
|
|
27
|
-
cachedInputTokens: .
|
|
33
|
+
inputTokens: 1.75,
|
|
34
|
+
outputTokens: 14,
|
|
35
|
+
cachedInputTokens: .175
|
|
28
36
|
}
|
|
29
37
|
};
|
|
30
38
|
const ANTHROPIC_COSTS = {
|
|
@@ -114,9 +122,16 @@ function getModelCosts(model) {
|
|
|
114
122
|
}
|
|
115
123
|
function calculateCostUsd(model, usage) {
|
|
116
124
|
const costs = getModelCosts(model);
|
|
117
|
-
|
|
125
|
+
const cachedInput = usage.cachedInputTokens ?? 0;
|
|
126
|
+
const nonCachedInput = usage.inputTokens - cachedInput;
|
|
127
|
+
const lc = costs.longContext;
|
|
128
|
+
const isLongContext = lc !== void 0 && usage.inputTokens > lc.threshold;
|
|
129
|
+
const inputRate = costs.inputTokens * (isLongContext ? lc.inputMultiplier : 1);
|
|
130
|
+
const cachedRate = costs.cachedInputTokens * (isLongContext ? lc.cachedInputMultiplier : 1);
|
|
131
|
+
const outputRate = costs.outputTokens * (isLongContext ? lc.outputMultiplier : 1);
|
|
132
|
+
return nonCachedInput / 1e6 * inputRate + usage.outputTokens / 1e6 * outputRate + cachedInput / 1e6 * cachedRate;
|
|
118
133
|
}
|
|
119
134
|
//#endregion
|
|
120
135
|
export { calculateCostUsd, getModelCosts };
|
|
121
136
|
|
|
122
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
137
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhnTogY29kZXggYXBwLXNlcnZlciBtb2RlbC9saXN0IFJQQyDroZwg7Iuk7LihICgyMDI2LTA1LTE4KVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICAvKipcbiAgICogbG9uZy1jb250ZXh0IO2VoOymnS4g7KCE7LK0IOyeheugpSDthqDtgbAoaW5wdXRfdG9rZW5zLCBjYWNoZV9yZWFkIO2PrO2VqCnsnbQgdGhyZXNob2xkIOy0iOqzvCDsi5xcbiAgICog7LSI6rO867aE66eM7J20IOyVhOuLiOudvCDsmpTssq0g7KCE7LK0KGZ1bGwgc2Vzc2lvbinsl5Ag67Cw7JyoIOyggeyaqS5cbiAgICovXG4gIGxvbmdDb250ZXh0Pzoge1xuICAgIHRocmVzaG9sZDogbnVtYmVyO1xuICAgIGlucHV0TXVsdGlwbGllcjogbnVtYmVyO1xuICAgIGNhY2hlZElucHV0TXVsdGlwbGllcjogbnVtYmVyO1xuICAgIG91dHB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgfTtcbn1cblxuLy8g4pSA4pSAIE9wZW5BSSDigJQgY29kZXggYXBwLXNlcnZlciDsl5DshJwg7IKs7JqpIOqwgOuKpe2VnCDrqqjrjbgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8g6rCA6rKpIOy2nOyymDogaHR0cHM6Ly9vcGVuYWkuY29tL2FwaS9wcmljaW5nICgyMDI2LTA2LTExIO2ZleyduClcbi8vIOyLoOuqqOuNuCDstpzsi5zrp4jri6Qg64uo6rCA6rCAIOuwlOuAjOuvgOuhnCg1LjLihpI1LjTihpI1LjUpIOuqqOuNuCDstpTqsIAg7IucIOuwmOuTnOyLnCDqs7Xsi50g7Y6Y7J207KeAIOyerO2ZleyduO2VtOyVvO2VqFxuXG4vLyBHUFQtNS407JeQ7IScIOyymOydjCDrj4TsnoXrkJwgbG9uZy1jb250ZXh0IO2VoOymnSAoNS4yLzUuMy1jb2RleOuKlCDtlbTri7kg7JeG7J2MLCA1LjQtbWluaeuKlCDrr7jtmZXsnbgpXG4vLyAyNzJLIOy0iOqzvCDsi5wgaW5wdXQgMnggLyBjYWNoZWQgMnggLyBvdXRwdXQgMS41eCDigJQg7LSI6rO867aE66eM7J20IOyVhOuLjCDshLjshZgg7KCE7LK07JeQIOyggeyaqeuQqFxuLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTUuNSAoXCJwcm9tcHRzIHdpdGggPjI3MksgaW5wdXQgdG9rZW5zXCIpXG5jb25zdCBMT05HX0NPTlRFWFRfMjcySzogTm9uTnVsbGFibGU8TW9kZWxDb3N0c1tcImxvbmdDb250ZXh0XCJdPiA9IHtcbiAgdGhyZXNob2xkOiAyNzJfMDAwLFxuICBpbnB1dE11bHRpcGxpZXI6IDIsXG4gIGNhY2hlZElucHV0TXVsdGlwbGllcjogMixcbiAgb3V0cHV0TXVsdGlwbGllcjogMS41LFxufTtcblxuY29uc3QgT1BFTkFJX0NPU1RTOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvc3RzPiA9IHtcbiAgLy8gaHR0cHM6Ly9vcGVuYWkuY29tL2luZGV4L2ludHJvZHVjaW5nLWdwdC01LTUvICgyMDI2LTA0IOy2nOyLnClcbiAgXCJncHQtNS41XCI6IHtcbiAgICBpbnB1dFRva2VuczogNSxcbiAgICBvdXRwdXRUb2tlbnM6IDMwLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICB9LFxuICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtNC8gKDIwMjYtMDMg7Lac7IucKVxuICBcImdwdC01LjRcIjoge1xuICAgIGlucHV0VG9rZW5zOiAyLjUsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4yNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIFwiZ3B0LTUuNC1taW5pXCI6IHsgaW5wdXRUb2tlbnM6IDAuNzUsIG91dHB1dFRva2VuczogNC41LCBjYWNoZWRJbnB1dFRva2VuczogMC4wNzUgfSxcbiAgLy8gZ3B0LTUuMuyZgCDrj5nsnbwg64uo6rCAIChjYWNoZWQgPSBpbnB1dOydmCAxMCUpXG4gIFwiZ3B0LTUuMy1jb2RleFwiOiB7IGlucHV0VG9rZW5zOiAxLjc1LCBvdXRwdXRUb2tlbnM6IDE0LCBjYWNoZWRJbnB1dFRva2VuczogMC4xNzUgfSxcbiAgLy8gaHR0cHM6Ly9vcGVuYWkuY29tL2luZGV4L2ludHJvZHVjaW5nLWdwdC01LTIvIChjYWNoZWQgaW5wdXQgOTAlIO2VoOyduCDrqoXsi5wpXG4gIFwiZ3B0LTUuMlwiOiB7IGlucHV0VG9rZW5zOiAxLjc1LCBvdXRwdXRUb2tlbnM6IDE0LCBjYWNoZWRJbnB1dFRva2VuczogMC4xNzUgfSxcbn07XG5cbi8vIOKUgOKUgCBBbnRocm9waWMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IEFOVEhST1BJQ19DT1NUUzogUmVjb3JkPHN0cmluZywgTW9kZWxDb3N0cz4gPSB7XG4gIHNvbm5ldDogeyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9LFxuICBcImNsYXVkZS0zLTUtaGFpa3VcIjogeyBpbnB1dFRva2VuczogMC44LCBvdXRwdXRUb2tlbnM6IDQsIGNhY2hlZElucHV0VG9rZW5zOiAwLjA4IH0sXG4gIFwiY2xhdWRlLWhhaWt1LTQtNVwiOiB7IGlucHV0VG9rZW5zOiAxLCBvdXRwdXRUb2tlbnM6IDUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjEgfSxcbiAgXCJjbGF1ZGUtMy01LXNvbm5ldFwiOiB7IGlucHV0VG9rZW5zOiAzLCBvdXRwdXRUb2tlbnM6IDE1LCBjYWNoZWRJbnB1dFRva2VuczogMC4zIH0sXG4gIFwiY2xhdWRlLTMtNy1zb25uZXRcIjogeyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9LFxuICBcImNsYXVkZS1zb25uZXQtNFwiOiB7IGlucHV0VG9rZW5zOiAzLCBvdXRwdXRUb2tlbnM6IDE1LCBjYWNoZWRJbnB1dFRva2VuczogMC4zIH0sXG4gIFwiY2xhdWRlLXNvbm5ldC00LTVcIjogeyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9LFxuICBcImNsYXVkZS1zb25uZXQtNC02XCI6IHsgaW5wdXRUb2tlbnM6IDMsIG91dHB1dFRva2VuczogMTUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjMgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtN1wiOiB7IGlucHV0VG9rZW5zOiAzLCBvdXRwdXRUb2tlbnM6IDE1LCBjYWNoZWRJbnB1dFRva2VuczogMC4zIH0sXG4gIFwiY2xhdWRlLW9wdXMtNFwiOiB7IGlucHV0VG9rZW5zOiAxNSwgb3V0cHV0VG9rZW5zOiA3NSwgY2FjaGVkSW5wdXRUb2tlbnM6IDEuNSB9LFxuICBcImNsYXVkZS1vcHVzLTQtMVwiOiB7IGlucHV0VG9rZW5zOiAxNSwgb3V0cHV0VG9rZW5zOiA3NSwgY2FjaGVkSW5wdXRUb2tlbnM6IDEuNSB9LFxuICBcImNsYXVkZS1vcHVzLTQtNVwiOiB7IGlucHV0VG9rZW5zOiA1LCBvdXRwdXRUb2tlbnM6IDI1LCBjYWNoZWRJbnB1dFRva2VuczogMC41IH0sXG4gIFwiY2xhdWRlLW9wdXMtNC02XCI6IHsgaW5wdXRUb2tlbnM6IDUsIG91dHB1dFRva2VuczogMjUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjUgfSxcbiAgXCJjbGF1ZGUtb3B1cy00LTdcIjogeyBpbnB1dFRva2VuczogNSwgb3V0cHV0VG9rZW5zOiAyNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSB9LFxuICBcImNsYXVkZS1vcHVzLTQtOFwiOiB7IGlucHV0VG9rZW5zOiA1LCBvdXRwdXRUb2tlbnM6IDI1LCBjYWNoZWRJbnB1dFRva2VuczogMC41IH0sXG59O1xuXG5jb25zdCBERUZBVUxUX0NPU1RTOiBNb2RlbENvc3RzID0geyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxDb3N0cyhtb2RlbDogc3RyaW5nKTogTW9kZWxDb3N0cyB7XG4gIHJldHVybiBPUEVOQUlfQ09TVFNbbW9kZWxdID8/IEFOVEhST1BJQ19DT1NUU1ttb2RlbF0gPz8gREVGQVVMVF9DT1NUUztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUNvc3RVc2QoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIHVzYWdlOiB7IGlucHV0VG9rZW5zOiBudW1iZXI7IG91dHB1dFRva2VuczogbnVtYmVyOyBjYWNoZWRJbnB1dFRva2Vucz86IG51bWJlciB9LFxuKTogbnVtYmVyIHtcbiAgY29uc3QgY29zdHMgPSBnZXRNb2RlbENvc3RzKG1vZGVsKTtcbiAgY29uc3QgY2FjaGVkSW5wdXQgPSB1c2FnZS5jYWNoZWRJbnB1dFRva2VucyA/PyAwO1xuICBjb25zdCBub25DYWNoZWRJbnB1dCA9IHVzYWdlLmlucHV0VG9rZW5zIC0gY2FjaGVkSW5wdXQ7XG5cbiAgLy8gbG9uZy1jb250ZXh0IO2VoOymnTog7KCE7LK0IOyeheugpShpbnB1dF90b2tlbnMsIGNhY2hlIO2PrO2VqCnsnbQgdGhyZXNob2xkIOy0iOqzvCDsi5wg7JqU7LKtIOyghOyytOyXkCDrsLDsnKgg7KCB7JqpXG4gIGNvbnN0IGxjID0gY29zdHMubG9uZ0NvbnRleHQ7XG4gIGNvbnN0IGlzTG9uZ0NvbnRleHQgPSBsYyAhPT0gdW5kZWZpbmVkICYmIHVzYWdlLmlucHV0VG9rZW5zID4gbGMudGhyZXNob2xkO1xuICBjb25zdCBpbnB1dFJhdGUgPSBjb3N0cy5pbnB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMuaW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IGNhY2hlZFJhdGUgPSBjb3N0cy5jYWNoZWRJbnB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMuY2FjaGVkSW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IG91dHB1dFJhdGUgPSBjb3N0cy5vdXRwdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLm91dHB1dE11bHRpcGxpZXIgOiAxKTtcblxuICByZXR1cm4gKFxuICAgIChub25DYWNoZWRJbnB1dCAvIDFfMDAwXzAwMCkgKiBpbnB1dFJhdGUgK1xuICAgICh1c2FnZS5vdXRwdXRUb2tlbnMgLyAxXzAwMF8wMDApICogb3V0cHV0UmF0ZSArXG4gICAgKGNhY2hl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
|
|
@@ -14,16 +14,53 @@ export interface ModelCosts {
|
|
|
14
14
|
inputTokens: number;
|
|
15
15
|
outputTokens: number;
|
|
16
16
|
cachedInputTokens: number;
|
|
17
|
+
/**
|
|
18
|
+
* long-context 할증. 전체 입력 토큰(input_tokens, cache_read 포함)이 threshold 초과 시
|
|
19
|
+
* 초과분만이 아니라 요청 전체(full session)에 배율 적용.
|
|
20
|
+
*/
|
|
21
|
+
longContext?: {
|
|
22
|
+
threshold: number;
|
|
23
|
+
inputMultiplier: number;
|
|
24
|
+
cachedInputMultiplier: number;
|
|
25
|
+
outputMultiplier: number;
|
|
26
|
+
};
|
|
17
27
|
}
|
|
18
28
|
|
|
19
29
|
// ── OpenAI — codex app-server 에서 사용 가능한 모델 ─────────────────
|
|
30
|
+
//
|
|
31
|
+
// 가격 출처: https://openai.com/api/pricing (2026-06-11 확인)
|
|
32
|
+
// 신모델 출시마다 단가가 바뀌므로(5.2→5.4→5.5) 모델 추가 시 반드시 공식 페이지 재확인해야함
|
|
33
|
+
|
|
34
|
+
// GPT-5.4에서 처음 도입된 long-context 할증 (5.2/5.3-codex는 해당 없음, 5.4-mini는 미확인)
|
|
35
|
+
// 272K 초과 시 input 2x / cached 2x / output 1.5x — 초과분만이 아닌 세션 전체에 적용됨
|
|
36
|
+
// @see https://developers.openai.com/api/docs/models/gpt-5.5 ("prompts with >272K input tokens")
|
|
37
|
+
const LONG_CONTEXT_272K: NonNullable<ModelCosts["longContext"]> = {
|
|
38
|
+
threshold: 272_000,
|
|
39
|
+
inputMultiplier: 2,
|
|
40
|
+
cachedInputMultiplier: 2,
|
|
41
|
+
outputMultiplier: 1.5,
|
|
42
|
+
};
|
|
20
43
|
|
|
21
44
|
const OPENAI_COSTS: Record<string, ModelCosts> = {
|
|
22
|
-
|
|
23
|
-
"gpt-5.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
45
|
+
// https://openai.com/index/introducing-gpt-5-5/ (2026-04 출시)
|
|
46
|
+
"gpt-5.5": {
|
|
47
|
+
inputTokens: 5,
|
|
48
|
+
outputTokens: 30,
|
|
49
|
+
cachedInputTokens: 0.5,
|
|
50
|
+
longContext: LONG_CONTEXT_272K,
|
|
51
|
+
},
|
|
52
|
+
// https://openai.com/index/introducing-gpt-5-4/ (2026-03 출시)
|
|
53
|
+
"gpt-5.4": {
|
|
54
|
+
inputTokens: 2.5,
|
|
55
|
+
outputTokens: 15,
|
|
56
|
+
cachedInputTokens: 0.25,
|
|
57
|
+
longContext: LONG_CONTEXT_272K,
|
|
58
|
+
},
|
|
59
|
+
"gpt-5.4-mini": { inputTokens: 0.75, outputTokens: 4.5, cachedInputTokens: 0.075 },
|
|
60
|
+
// gpt-5.2와 동일 단가 (cached = input의 10%)
|
|
61
|
+
"gpt-5.3-codex": { inputTokens: 1.75, outputTokens: 14, cachedInputTokens: 0.175 },
|
|
62
|
+
// https://openai.com/index/introducing-gpt-5-2/ (cached input 90% 할인 명시)
|
|
63
|
+
"gpt-5.2": { inputTokens: 1.75, outputTokens: 14, cachedInputTokens: 0.175 },
|
|
27
64
|
};
|
|
28
65
|
|
|
29
66
|
// ── Anthropic ───────────────────────────────────────────────────────
|
|
@@ -57,10 +94,19 @@ export function calculateCostUsd(
|
|
|
57
94
|
usage: { inputTokens: number; outputTokens: number; cachedInputTokens?: number },
|
|
58
95
|
): number {
|
|
59
96
|
const costs = getModelCosts(model);
|
|
60
|
-
const
|
|
97
|
+
const cachedInput = usage.cachedInputTokens ?? 0;
|
|
98
|
+
const nonCachedInput = usage.inputTokens - cachedInput;
|
|
99
|
+
|
|
100
|
+
// long-context 할증: 전체 입력(input_tokens, cache 포함)이 threshold 초과 시 요청 전체에 배율 적용
|
|
101
|
+
const lc = costs.longContext;
|
|
102
|
+
const isLongContext = lc !== undefined && usage.inputTokens > lc.threshold;
|
|
103
|
+
const inputRate = costs.inputTokens * (isLongContext ? lc.inputMultiplier : 1);
|
|
104
|
+
const cachedRate = costs.cachedInputTokens * (isLongContext ? lc.cachedInputMultiplier : 1);
|
|
105
|
+
const outputRate = costs.outputTokens * (isLongContext ? lc.outputMultiplier : 1);
|
|
106
|
+
|
|
61
107
|
return (
|
|
62
|
-
(nonCachedInput / 1_000_000) *
|
|
63
|
-
(usage.outputTokens / 1_000_000) *
|
|
64
|
-
(
|
|
108
|
+
(nonCachedInput / 1_000_000) * inputRate +
|
|
109
|
+
(usage.outputTokens / 1_000_000) * outputRate +
|
|
110
|
+
(cachedInput / 1_000_000) * cachedRate
|
|
65
111
|
);
|
|
66
112
|
}
|