Files
chaos-api/web/src/constants/billing.constants.js
T

57 lines
3.0 KiB
JavaScript
Vendored

/**
* Single source of truth for billing expression variables.
*
* Every expression variable (p, c, cr, cc, ...) is defined here once.
* All frontend consumers — editor, estimator, log display, model detail —
* derive their data structures from this registry.
*
* To add a new variable:
* 1. Add an entry here
* 2. Backend: add to TokenParams, compileEnvPrototype, runProgram env, BuildTieredTokenParams
*/
export const BILLING_VARS = [
{ key: 'p', field: 'inputPrice', tierField: 'input_unit_cost', label: '输入价格', shortLabel: '输入', side: 'input', isBase: true },
{ key: 'c', field: 'outputPrice', tierField: 'output_unit_cost', label: '补全价格', shortLabel: '补全', side: 'output', isBase: true },
{ key: 'len', field: null, tierField: null, label: '输入长度', shortLabel: '长度', side: 'condition', isConditionOnly: true },
{ key: 'cr', field: 'cacheReadPrice', tierField: 'cache_read_unit_cost', label: '缓存读取价格', shortLabel: '缓存读', side: 'input', group: 'cache' },
{ key: 'cc', field: 'cacheCreatePrice', tierField: 'cache_create_unit_cost', label: '缓存创建价格', shortLabel: '缓存创建', side: 'input', group: 'cache' },
{ key: 'cc1h', field: 'cacheCreate1hPrice', tierField: 'cache_create_1h_unit_cost', label: '1h缓存创建价格', shortLabel: '1h缓存创建', side: 'input', group: 'cache' },
{ key: 'img', field: 'imagePrice', tierField: 'image_unit_cost', label: '图片输入价格', shortLabel: '图片输入', side: 'input', group: 'media' },
{ key: 'img_o', field: 'imageOutputPrice', tierField: 'image_output_unit_cost', label: '图片输出价格', shortLabel: '图片输出', side: 'output', group: 'media' },
{ key: 'ai', field: 'audioInputPrice', tierField: 'audio_input_unit_cost', label: '音频输入价格', shortLabel: '音频输入', side: 'input', group: 'media' },
{ key: 'ao', field: 'audioOutputPrice', tierField: 'audio_output_unit_cost', label: '音频补全价格', shortLabel: '音频输出', side: 'output', group: 'media' },
];
export const BILLING_VAR_KEYS = BILLING_VARS.map((v) => v.key);
export const BILLING_PRICING_VARS = BILLING_VARS.filter((v) => !v.isConditionOnly);
export const BILLING_EXTRA_VARS = BILLING_VARS.filter((v) => !v.isBase && !v.isConditionOnly);
export const BILLING_VAR_KEY_TO_FIELD = Object.fromEntries(
BILLING_PRICING_VARS.map((v) => [v.key, v.field]),
);
export const BILLING_VAR_FIELD_TO_LABEL = Object.fromEntries(
BILLING_PRICING_VARS.map((v) => [v.field, v.label]),
);
export const BILLING_VAR_FIELD_TO_SHORT_LABEL = Object.fromEntries(
BILLING_PRICING_VARS.map((v) => [v.field, v.shortLabel]),
);
export const BILLING_CACHE_VAR_MAP = BILLING_EXTRA_VARS.map((v) => ({
field: v.tierField,
exprVar: v.key,
}));
export const BILLING_VAR_REGEX = new RegExp(
`\\b(${BILLING_PRICING_VARS.map((v) => v.key).join('|')})\\s*\\*\\s*([\\d.eE+-]+)`,
'g',
);
export const BILLING_CONDITION_VARS = BILLING_VARS.filter(
(v) => v.isBase || v.isConditionOnly,
).map((v) => v.key);