@purpleschool/gptbot 0.14.45 → 0.14.47

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,7 +1,11 @@
1
1
  import { ImageModelPricingRules } from '../../models';
2
2
  export type GptImage2Quality = 'low' | 'medium' | 'high';
3
- export type GptImage2AspectRatio = '1:1' | '16:9' | '9:16' | '21:9';
3
+ export type GptImage2AspectRatio = '1:1' | '4:3' | '5:4' | '16:9' | '21:9' | '3:4' | '4:5' | '9:16' | '9:21';
4
4
  export type GptImage2ResolutionTier = '1K' | '2K' | '4K';
5
+ export type GptImage2Size = {
6
+ width: number;
7
+ height: number;
8
+ };
5
9
  export declare const GPT_IMAGE_2_DEFAULT_OUTPUT_PRICE_PER_1M_USD = 30;
6
10
  export declare const DEFAULT_STAR_PRICE_USD = 0.018;
7
11
  export declare const DEFAULT_TARGET_MARGIN = 0.6;
@@ -11,6 +15,12 @@ export declare function getGptImage2OutputTokensByTier(params: {
11
15
  aspectRatio: GptImage2AspectRatio;
12
16
  resolutionTier: GptImage2ResolutionTier;
13
17
  }): number;
18
+ export declare function normalizeGptImage2SizeToOpenAILimits(size: GptImage2Size): GptImage2Size;
19
+ export declare function calculateGptImage2OutputTokensFromSize(params: {
20
+ quality: GptImage2Quality;
21
+ width: number;
22
+ height: number;
23
+ }): number;
14
24
  export declare function estimateGptImage2OutputCostUsdFromTokens(params: {
15
25
  outputTokens: number;
16
26
  outputPricePer1MUsd?: number;
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GPT_IMAGE_2_INPUT_IMAGE_SURCHARGE_STARS = exports.DEFAULT_TARGET_MARGIN = exports.DEFAULT_STAR_PRICE_USD = exports.GPT_IMAGE_2_DEFAULT_OUTPUT_PRICE_PER_1M_USD = void 0;
4
4
  exports.getGptImage2OutputTokensByTier = getGptImage2OutputTokensByTier;
5
+ exports.normalizeGptImage2SizeToOpenAILimits = normalizeGptImage2SizeToOpenAILimits;
6
+ exports.calculateGptImage2OutputTokensFromSize = calculateGptImage2OutputTokensFromSize;
5
7
  exports.estimateGptImage2OutputCostUsdFromTokens = estimateGptImage2OutputCostUsdFromTokens;
6
8
  exports.applyTargetMargin = applyTargetMargin;
7
9
  exports.convertUsdToStarsCeil = convertUsdToStarsCeil;
@@ -11,29 +13,66 @@ exports.GPT_IMAGE_2_DEFAULT_OUTPUT_PRICE_PER_1M_USD = 30;
11
13
  exports.DEFAULT_STAR_PRICE_USD = 0.018;
12
14
  exports.DEFAULT_TARGET_MARGIN = 0.6;
13
15
  exports.GPT_IMAGE_2_INPUT_IMAGE_SURCHARGE_STARS = 2;
14
- const GPT_IMAGE_2_OUTPUT_TOKENS_BY_QUALITY_RATIO_AND_TIER = {
15
- low: {
16
- '1:1': { '1K': 196, '2K': 397, '4K': 659 },
17
- '16:9': { '1K': 106, '2K': 205, '4K': 371 },
18
- '9:16': { '1K': 106, '2K': 205, '4K': 371 },
19
- '21:9': { '1K': 90, '2K': 192, '4K': 234 },
20
- },
21
- medium: {
22
- '1:1': { '1K': 1756, '2K': 3568, '4K': 5930 },
23
- '16:9': { '1K': 947, '2K': 1843, '4K': 3336 },
24
- '9:16': { '1K': 947, '2K': 1843, '4K': 3336 },
25
- '21:9': { '1K': 809, '2K': 1724, '4K': 2099 },
26
- },
27
- high: {
28
- '1:1': { '1K': 7024, '2K': 14272, '4K': 23719 },
29
- '16:9': { '1K': 3787, '2K': 7370, '4K': 13342 },
30
- '9:16': { '1K': 3787, '2K': 7370, '4K': 13342 },
31
- '21:9': { '1K': 3159, '2K': 6729, '4K': 8196 },
32
- },
16
+ const GPT_IMAGE_2_BASE_SIZE_BY_ASPECT_RATIO = {
17
+ '1:1': { width: 1024, height: 1024 },
18
+ '4:3': { width: 1344, height: 1024 },
19
+ '5:4': { width: 1280, height: 1024 },
20
+ '16:9': { width: 1280, height: 720 },
21
+ '21:9': { width: 1680, height: 720 },
22
+ '3:4': { width: 1024, height: 1344 },
23
+ '4:5': { width: 1024, height: 1280 },
24
+ '9:16': { width: 720, height: 1280 },
25
+ '9:21': { width: 720, height: 1680 },
33
26
  };
27
+ const GPT_IMAGE_2_QUALITY_BASE_TOKENS = {
28
+ low: 16,
29
+ medium: 48,
30
+ high: 96,
31
+ };
32
+ const GPT_IMAGE_2_RESOLUTION_MULTIPLIER = {
33
+ '1K': 1,
34
+ '2K': 2,
35
+ '4K': 4,
36
+ };
37
+ const GPT_IMAGE_2_MAX_EDGE = 3840;
38
+ const GPT_IMAGE_2_MAX_PIXEL_BUDGET = 8294400;
39
+ const GPT_IMAGE_2_SIZE_STEP = 16;
34
40
  function getGptImage2OutputTokensByTier(params) {
35
41
  const { quality, aspectRatio, resolutionTier } = params;
36
- return GPT_IMAGE_2_OUTPUT_TOKENS_BY_QUALITY_RATIO_AND_TIER[quality][aspectRatio][resolutionTier];
42
+ const baseSize = GPT_IMAGE_2_BASE_SIZE_BY_ASPECT_RATIO[aspectRatio];
43
+ const multiplier = GPT_IMAGE_2_RESOLUTION_MULTIPLIER[resolutionTier];
44
+ const normalizedSize = normalizeGptImage2SizeToOpenAILimits({
45
+ width: Math.round(baseSize.width * multiplier),
46
+ height: Math.round(baseSize.height * multiplier),
47
+ });
48
+ return calculateGptImage2OutputTokensFromSize(Object.assign({ quality }, normalizedSize));
49
+ }
50
+ function normalizeGptImage2SizeToOpenAILimits(size) {
51
+ let scale = 1;
52
+ const longestEdge = Math.max(size.width, size.height);
53
+ if (longestEdge > GPT_IMAGE_2_MAX_EDGE) {
54
+ scale = Math.min(scale, GPT_IMAGE_2_MAX_EDGE / longestEdge);
55
+ }
56
+ const pixelCount = size.width * size.height;
57
+ if (pixelCount > GPT_IMAGE_2_MAX_PIXEL_BUDGET) {
58
+ scale = Math.min(scale, Math.sqrt(GPT_IMAGE_2_MAX_PIXEL_BUDGET / pixelCount));
59
+ }
60
+ const normalizedWidth = Math.floor((size.width * scale) / GPT_IMAGE_2_SIZE_STEP) * GPT_IMAGE_2_SIZE_STEP;
61
+ const normalizedHeight = Math.floor((size.height * scale) / GPT_IMAGE_2_SIZE_STEP) * GPT_IMAGE_2_SIZE_STEP;
62
+ return {
63
+ width: Math.max(GPT_IMAGE_2_SIZE_STEP, normalizedWidth),
64
+ height: Math.max(GPT_IMAGE_2_SIZE_STEP, normalizedHeight),
65
+ };
66
+ }
67
+ function calculateGptImage2OutputTokensFromSize(params) {
68
+ const { quality, width, height } = params;
69
+ const longestEdge = Math.max(width, height);
70
+ const shortestEdge = Math.min(width, height);
71
+ const qualityBaseTokens = GPT_IMAGE_2_QUALITY_BASE_TOKENS[quality];
72
+ const scaledShortEdgeTokens = Math.round((qualityBaseTokens * shortestEdge) / longestEdge);
73
+ const widthTokens = width >= height ? qualityBaseTokens : scaledShortEdgeTokens;
74
+ const heightTokens = width >= height ? scaledShortEdgeTokens : qualityBaseTokens;
75
+ return Math.ceil((widthTokens * heightTokens * (2000000 + width * height)) / 4000000);
37
76
  }
38
77
  function estimateGptImage2OutputCostUsdFromTokens(params) {
39
78
  const { outputTokens, outputPricePer1MUsd = exports.GPT_IMAGE_2_DEFAULT_OUTPUT_PRICE_PER_1M_USD } = params;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@purpleschool/gptbot",
3
- "version": "0.14.45",
3
+ "version": "0.14.47",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",