@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: 2,
6
- outputTokens: 8,
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: 8,
12
- cachedInputTokens: .5
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: .4,
16
- outputTokens: 1.6,
17
- cachedInputTokens: .1
23
+ inputTokens: .75,
24
+ outputTokens: 4.5,
25
+ cachedInputTokens: .075
18
26
  },
19
27
  "gpt-5.3-codex": {
20
- inputTokens: 2,
21
- outputTokens: 8,
22
- cachedInputTokens: .5
28
+ inputTokens: 1.75,
29
+ outputTokens: 14,
30
+ cachedInputTokens: .175
23
31
  },
24
32
  "gpt-5.2": {
25
- inputTokens: 2,
26
- outputTokens: 8,
27
- cachedInputTokens: .5
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
- return (usage.inputTokens - (usage.cachedInputTokens ?? 0)) / 1e6 * costs.inputTokens + usage.outputTokens / 1e6 * costs.outputTokens + (usage.cachedInputTokens ?? 0) / 1e6 * costs.cachedInputTokens;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhnTogY29kZXggYXBwLXNlcnZlciBtb2RlbC9saXN0IFJQQyDroZwg7Iuk7LihICgyMDI2LTA1LTE4KVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgT3BlbkFJIOKAlCBjb2RleCBhcHAtc2VydmVyIOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOuqqOuNuCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgT1BFTkFJX0NPU1RTOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvc3RzPiA9IHtcbiAgXCJncHQtNS41XCI6IHsgaW5wdXRUb2tlbnM6IDIsIG91dHB1dFRva2VuczogOCwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSB9LFxuICBcImdwdC01LjRcIjogeyBpbnB1dFRva2VuczogMiwgb3V0cHV0VG9rZW5zOiA4LCBjYWNoZWRJbnB1dFRva2VuczogMC41IH0sXG4gIFwiZ3B0LTUuNC1taW5pXCI6IHsgaW5wdXRUb2tlbnM6IDAuNCwgb3V0cHV0VG9rZW5zOiAxLjYsIGNhY2hlZElucHV0VG9rZW5zOiAwLjEgfSxcbiAgXCJncHQtNS4zLWNvZGV4XCI6IHsgaW5wdXRUb2tlbnM6IDIsIG91dHB1dFRva2VuczogOCwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSB9LFxuICBcImdwdC01LjJcIjogeyBpbnB1dFRva2VuczogMiwgb3V0cHV0VG9rZW5zOiA4LCBjYWNoZWRJbnB1dFRva2VuczogMC41IH0sXG59O1xuXG4vLyDilIDilIAgQW50aHJvcGljIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBBTlRIUk9QSUNfQ09TVFM6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29zdHM+ID0ge1xuICBzb25uZXQ6IHsgaW5wdXRUb2tlbnM6IDMsIG91dHB1dFRva2VuczogMTUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjMgfSxcbiAgXCJjbGF1ZGUtMy01LWhhaWt1XCI6IHsgaW5wdXRUb2tlbnM6IDAuOCwgb3V0cHV0VG9rZW5zOiA0LCBjYWNoZWRJbnB1dFRva2VuczogMC4wOCB9LFxuICBcImNsYXVkZS1oYWlrdS00LTVcIjogeyBpbnB1dFRva2VuczogMSwgb3V0cHV0VG9rZW5zOiA1LCBjYWNoZWRJbnB1dFRva2VuczogMC4xIH0sXG4gIFwiY2xhdWRlLTMtNS1zb25uZXRcIjogeyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9LFxuICBcImNsYXVkZS0zLTctc29ubmV0XCI6IHsgaW5wdXRUb2tlbnM6IDMsIG91dHB1dFRva2VuczogMTUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjMgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTRcIjogeyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9LFxuICBcImNsYXVkZS1zb25uZXQtNC01XCI6IHsgaW5wdXRUb2tlbnM6IDMsIG91dHB1dFRva2VuczogMTUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjMgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtNlwiOiB7IGlucHV0VG9rZW5zOiAzLCBvdXRwdXRUb2tlbnM6IDE1LCBjYWNoZWRJbnB1dFRva2VuczogMC4zIH0sXG4gIFwiY2xhdWRlLXNvbm5ldC00LTdcIjogeyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9LFxuICBcImNsYXVkZS1vcHVzLTRcIjogeyBpbnB1dFRva2VuczogMTUsIG91dHB1dFRva2VuczogNzUsIGNhY2hlZElucHV0VG9rZW5zOiAxLjUgfSxcbiAgXCJjbGF1ZGUtb3B1cy00LTFcIjogeyBpbnB1dFRva2VuczogMTUsIG91dHB1dFRva2VuczogNzUsIGNhY2hlZElucHV0VG9rZW5zOiAxLjUgfSxcbiAgXCJjbGF1ZGUtb3B1cy00LTVcIjogeyBpbnB1dFRva2VuczogNSwgb3V0cHV0VG9rZW5zOiAyNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSB9LFxuICBcImNsYXVkZS1vcHVzLTQtNlwiOiB7IGlucHV0VG9rZW5zOiA1LCBvdXRwdXRUb2tlbnM6IDI1LCBjYWNoZWRJbnB1dFRva2VuczogMC41IH0sXG4gIFwiY2xhdWRlLW9wdXMtNC03XCI6IHsgaW5wdXRUb2tlbnM6IDUsIG91dHB1dFRva2VuczogMjUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjUgfSxcbiAgXCJjbGF1ZGUtb3B1cy00LThcIjogeyBpbnB1dFRva2VuczogNSwgb3V0cHV0VG9rZW5zOiAyNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSB9LFxufTtcblxuY29uc3QgREVGQVVMVF9DT1NUUzogTW9kZWxDb3N0cyA9IHsgaW5wdXRUb2tlbnM6IDMsIG91dHB1dFRva2VuczogMTUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjMgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQ29zdHMobW9kZWw6IHN0cmluZyk6IE1vZGVsQ29zdHMge1xuICByZXR1cm4gT1BFTkFJX0NPU1RTW21vZGVsXSA/PyBBTlRIUk9QSUNfQ09TVFNbbW9kZWxdID8/IERFRkFVTFRfQ09TVFM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb3N0VXNkKFxuICBtb2RlbDogc3RyaW5nLFxuICB1c2FnZTogeyBpbnB1dFRva2VuczogbnVtYmVyOyBvdXRwdXRUb2tlbnM6IG51bWJlcjsgY2FjaGVkSW5wdXRUb2tlbnM/OiBudW1iZXIgfSxcbik6IG51bWJlciB7XG4gIGNvbnN0IGNvc3RzID0gZ2V0TW9kZWxDb3N0cyhtb2RlbCk7XG4gIGNvbnN0IG5vbkNhY2hlZElucHV0ID0gdXNhZ2UuaW5wdXRUb2tlbnMgLSAodXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMgPz8gMCk7XG4gIHJldHVybiAoXG4gICAgKG5vbkNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGNvc3RzLmlucHV0VG9rZW5zICtcbiAgICAodXNhZ2Uub3V0cHV0VG9rZW5zIC8gMV8wMDBfMDAwKSAqIGNvc3RzLm91dHB1dFRva2VucyArXG4gICAgKCh1c2FnZS5jYWNoZWRJbnB1dFRva2VucyA/PyAwKSAvIDFfMDAwXzAwMCkgKiBjb3N0cy5jYWNoZWRJbnB1dFRva2Vuc1xuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQW9CQSxNQUFNLGVBQTJDO0NBQy9DLFdBQVc7RUFBRSxhQUFhO0VBQUcsY0FBYztFQUFHLG1CQUFtQjtFQUFLO0NBQ3RFLFdBQVc7RUFBRSxhQUFhO0VBQUcsY0FBYztFQUFHLG1CQUFtQjtFQUFLO0NBQ3RFLGdCQUFnQjtFQUFFLGFBQWE7RUFBSyxjQUFjO0VBQUssbUJBQW1CO0VBQUs7Q0FDL0UsaUJBQWlCO0VBQUUsYUFBYTtFQUFHLGNBQWM7RUFBRyxtQkFBbUI7RUFBSztDQUM1RSxXQUFXO0VBQUUsYUFBYTtFQUFHLGNBQWM7RUFBRyxtQkFBbUI7RUFBSztDQUN2RTtBQUlELE1BQU0sa0JBQThDO0NBQ2xELFFBQVE7RUFBRSxhQUFhO0VBQUcsY0FBYztFQUFJLG1CQUFtQjtFQUFLO0NBQ3BFLG9CQUFvQjtFQUFFLGFBQWE7RUFBSyxjQUFjO0VBQUcsbUJBQW1CO0VBQU07Q0FDbEYsb0JBQW9CO0VBQUUsYUFBYTtFQUFHLGNBQWM7RUFBRyxtQkFBbUI7RUFBSztDQUMvRSxxQkFBcUI7RUFBRSxhQUFhO0VBQUcsY0FBYztFQUFJLG1CQUFtQjtFQUFLO0NBQ2pGLHFCQUFxQjtFQUFFLGFBQWE7RUFBRyxjQUFjO0VBQUksbUJBQW1CO0VBQUs7Q0FDakYsbUJBQW1CO0VBQUUsYUFBYTtFQUFHLGNBQWM7RUFBSSxtQkFBbUI7RUFBSztDQUMvRSxxQkFBcUI7RUFBRSxhQUFhO0VBQUcsY0FBYztFQUFJLG1CQUFtQjtFQUFLO0NBQ2pGLHFCQUFxQjtFQUFFLGFBQWE7RUFBRyxjQUFjO0VBQUksbUJBQW1CO0VBQUs7Q0FDakYscUJBQXFCO0VBQUUsYUFBYTtFQUFHLGNBQWM7RUFBSSxtQkFBbUI7RUFBSztDQUNqRixpQkFBaUI7RUFBRSxhQUFhO0VBQUksY0FBYztFQUFJLG1CQUFtQjtFQUFLO0NBQzlFLG1CQUFtQjtFQUFFLGFBQWE7RUFBSSxjQUFjO0VBQUksbUJBQW1CO0VBQUs7Q0FDaEYsbUJBQW1CO0VBQUUsYUFBYTtFQUFHLGNBQWM7RUFBSSxtQkFBbUI7RUFBSztDQUMvRSxtQkFBbUI7RUFBRSxhQUFhO0VBQUcsY0FBYztFQUFJLG1CQUFtQjtFQUFLO0NBQy9FLG1CQUFtQjtFQUFFLGFBQWE7RUFBRyxjQUFjO0VBQUksbUJBQW1CO0VBQUs7Q0FDL0UsbUJBQW1CO0VBQUUsYUFBYTtFQUFHLGNBQWM7RUFBSSxtQkFBbUI7RUFBSztDQUNoRjtBQUVELE1BQU0sZ0JBQTRCO0NBQUUsYUFBYTtDQUFHLGNBQWM7Q0FBSSxtQkFBbUI7Q0FBSztBQUU5RixTQUFnQixjQUFjLE9BQTJCO0FBQ3ZELFFBQU8sYUFBYSxVQUFVLGdCQUFnQixVQUFVOztBQUcxRCxTQUFnQixpQkFDZCxPQUNBLE9BQ1E7Q0FDUixNQUFNLFFBQVEsY0FBYyxNQUFNO0FBRWxDLFNBRHVCLE1BQU0sZUFBZSxNQUFNLHFCQUFxQixNQUVuRCxNQUFhLE1BQU0sY0FDcEMsTUFBTSxlQUFlLE1BQWEsTUFBTSxnQkFDdkMsTUFBTSxxQkFBcUIsS0FBSyxNQUFhLE1BQU0ifQ==
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
- "gpt-5.5": { inputTokens: 2, outputTokens: 8, cachedInputTokens: 0.5 },
23
- "gpt-5.4": { inputTokens: 2, outputTokens: 8, cachedInputTokens: 0.5 },
24
- "gpt-5.4-mini": { inputTokens: 0.4, outputTokens: 1.6, cachedInputTokens: 0.1 },
25
- "gpt-5.3-codex": { inputTokens: 2, outputTokens: 8, cachedInputTokens: 0.5 },
26
- "gpt-5.2": { inputTokens: 2, outputTokens: 8, cachedInputTokens: 0.5 },
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 nonCachedInput = usage.inputTokens - (usage.cachedInputTokens ?? 0);
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) * costs.inputTokens +
63
- (usage.outputTokens / 1_000_000) * costs.outputTokens +
64
- ((usage.cachedInputTokens ?? 0) / 1_000_000) * costs.cachedInputTokens
108
+ (nonCachedInput / 1_000_000) * inputRate +
109
+ (usage.outputTokens / 1_000_000) * outputRate +
110
+ (cachedInput / 1_000_000) * cachedRate
65
111
  );
66
112
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cartanova/qgrid-cli",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/cartanova-ai/qgrid"