diff --git a/web/src/components/settings/RatioSetting.jsx b/web/src/components/settings/RatioSetting.jsx index 1b7b67f..f2776e8 100644 --- a/web/src/components/settings/RatioSetting.jsx +++ b/web/src/components/settings/RatioSetting.jsx @@ -27,6 +27,7 @@ import ModelSettingsVisualEditor from '../../pages/Setting/Ratio/ModelSettingsVi import ModelRatioNotSetEditor from '../../pages/Setting/Ratio/ModelRationNotSetEditor'; import UpstreamRatioSync from '../../pages/Setting/Ratio/UpstreamRatioSync'; import PricingTagManager from '../../pages/Setting/Ratio/PricingTagManager'; +import ModelPricing from '../../pages/Setting/Operation/ModelPricing'; import { API, showError, toBoolean } from '../../helpers'; @@ -111,6 +112,11 @@ const RatioSetting = () => { + +
+ +
+
diff --git a/web/src/pages/Setting/Operation/ModelPricing/DimensionEditor.jsx b/web/src/pages/Setting/Operation/ModelPricing/DimensionEditor.jsx index 9e863a5..5d461a9 100644 --- a/web/src/pages/Setting/Operation/ModelPricing/DimensionEditor.jsx +++ b/web/src/pages/Setting/Operation/ModelPricing/DimensionEditor.jsx @@ -1,10 +1,8 @@ import React from 'react'; -import { Button, Checkbox, Input, Select, Space, Table } from '@douyinfe/semi-ui'; -import { Plus, Trash2 } from 'lucide-react'; +import { Button, Checkbox, Input, Select, Space, Table, Tooltip, Typography } from '@douyinfe/semi-ui'; +import { Info, Plus, Trash2 } from 'lucide-react'; import { useTranslation } from 'react-i18next'; -import { parseDimensionValue } from './pricingConfig'; - -const SOURCE_OPTIONS = ['request.resolution', 'request.duration', 'request.options.size', 'derived.input_mode', 'derived.megapixels', 'derived.aspect_ratio']; +import { DIMENSION_SOURCE_TYPES, composeDimensionSource, parseDimensionValue, splitDimensionSource } from './pricingConfig'; export default function DimensionEditor({ dimensions, onChange }) { const { t } = useTranslation(); @@ -19,13 +17,66 @@ export default function DimensionEditor({ dimensions, onChange }) { const add = () => onChange([...dimensions, { key: 'duration', source: 'request.duration', type: 'number', default: null }]); const columns = [ - { title: t('Key'), dataIndex: 'key', render: (value, _, index) => update(index, { key })} /> }, + { title: t('Key'), dataIndex: 'key', width: 140, render: (value, _, index) => update(index, { key })} data-testid={`dimension-key-${index}`} /> }, + { + title: ( + + {t('来源类型')} + + + + + ), + dataIndex: 'source_type', + width: 140, + render: (_, row, index) => { + const parsed = splitDimensionSource(row.source); + return ( + + ); + }, + }, + { + title: t('路径'), + dataIndex: 'source_path', + width: 210, + render: (_, row, index) => { + const parsed = splitDimensionSource(row.source); + return ( + update(index, { source: composeDimensionSource(parsed.sourceType, path) })} + data-testid={`dimension-source-path-${index}`} + /> + ); + }, + }, { - title: t('来源'), + title: t('保存值'), dataIndex: 'source', - render: (value, _, index) => ( - update(index, { source })} style={{ width: 140 }}> + {getSourceExamples(row.key).map((source) => ( {source} @@ -59,6 +110,7 @@ export default function DimensionEditor({ dimensions, onChange }) { { title: t('默认值'), dataIndex: 'default', + width: 140, render: (value, row, index) => ( - `${index}`} /> -
`${index}`} scroll={{ x: 1280 }} /> + + {t('读取不到必填维度时会拒绝计费;读取不到可选维度时使用默认值。高级模式会直接保存路径内容。')} + + @@ -89,3 +144,9 @@ const defaultForType = (type) => { if (type === 'boolean') return false; return ''; }; + +const getSourceExamples = (key) => { + const examples = ['request.resolution', 'request.duration', 'request.options.size', 'derived.input_mode', 'derived.megapixels', 'derived.aspect_ratio']; + if (key && !examples.includes(`request.${key}`)) return [`request.${key}`, ...examples]; + return examples; +}; diff --git a/web/src/pages/Setting/Operation/ModelPricing/Editor.jsx b/web/src/pages/Setting/Operation/ModelPricing/Editor.jsx index 237ed52..44dea9a 100644 --- a/web/src/pages/Setting/Operation/ModelPricing/Editor.jsx +++ b/web/src/pages/Setting/Operation/ModelPricing/Editor.jsx @@ -102,15 +102,16 @@ export default function Editor({ visible, modelName, config, onClose, onSaved }) return ( - @@ -118,7 +119,7 @@ export default function Editor({ visible, modelName, config, onClose, onSaved }) > - + - @@ -152,7 +153,7 @@ export default function Editor({ visible, modelName, config, onClose, onSaved }) -