mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-11-03 00:33:13 +00:00
feat: 分组支持逐模型定价,并可关闭长上下文阶梯
运营需要按分组覆盖渠道/内置价,且部分套餐不应自动吃 200k 倍率。 原先只能改渠道价卡,分组侧只剩 Voice 三列。 - groups 新增 model_pricing / long_context_pricing_enabled,解析链改为 Group → Channel → 内置 - 关闭长上下文时 token 模型只取最低档;video 按秒计费可写进同一价卡 - 回退价对齐官方卡:4.5 缓存 $0.30、4.3/imagine/audio/search 默认值一并校正
This commit is contained in:
1 parent
69648476d4
commit
f3d9491071
35 files changed
+1094
-176
No files matched your search
@@ -194,11 +194,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Image mode -->
|
||||
<div v-else-if="entry.billing_mode === 'image'">
|
||||
<!-- Image/video mode -->
|
||||
<div v-else-if="entry.billing_mode === 'image' || entry.billing_mode === 'video'">
|
||||
<!-- Default image price (per-request, same as per_request mode) -->
|
||||
<label class="mt-3 block text-xs font-medium text-gray-500 dark:text-gray-400">
|
||||
{{ t('admin.channels.form.defaultImagePrice') }}
|
||||
{{ entry.billing_mode === 'video' ? t('admin.channels.form.defaultVideoPrice') : t('admin.channels.form.defaultImagePrice') }}
|
||||
<span class="ml-1 font-normal text-gray-400">$</span>
|
||||
</label>
|
||||
<div class="mt-1 w-48">
|
||||
@@ -209,9 +209,9 @@
|
||||
<!-- Image tiers -->
|
||||
<div class="mt-3 flex items-center justify-between">
|
||||
<label class="text-xs font-medium text-gray-500 dark:text-gray-400">
|
||||
{{ t('admin.channels.form.imageTiers') }}
|
||||
{{ entry.billing_mode === 'video' ? t('admin.channels.form.videoTiers') : t('admin.channels.form.imageTiers') }}
|
||||
</label>
|
||||
<button type="button" @click="addImageTier" class="text-xs text-primary-600 hover:text-primary-700">
|
||||
<button type="button" @click="addMediaTier" class="text-xs text-primary-600 hover:text-primary-700">
|
||||
+ {{ t('admin.channels.form.addTier') }}
|
||||
</button>
|
||||
</div>
|
||||
@@ -261,7 +261,8 @@ const collapsed = ref(props.entry.models.length > 0)
|
||||
const billingModeOptions = computed(() => [
|
||||
{ value: 'token', label: t('admin.channels.billingMode.token') },
|
||||
{ value: 'per_request', label: t('admin.channels.billingMode.perRequest') },
|
||||
{ value: 'image', label: t('admin.channels.billingMode.image') }
|
||||
{ value: 'image', label: t('admin.channels.billingMode.image') },
|
||||
{ value: 'video', label: t('admin.channels.billingMode.video') }
|
||||
])
|
||||
|
||||
const billingModeLabel = computed(() => {
|
||||
@@ -284,9 +285,11 @@ function addInterval() {
|
||||
emit('update', { ...props.entry, intervals })
|
||||
}
|
||||
|
||||
function addImageTier() {
|
||||
function addMediaTier() {
|
||||
const intervals = [...(props.entry.intervals || [])]
|
||||
const labels = ['1K', '2K', '4K', 'HD']
|
||||
const labels = props.entry.billing_mode === 'video'
|
||||
? ['480p', '720p', '1080p']
|
||||
: ['1K', '2K', '4K', 'HD']
|
||||
intervals.push({
|
||||
min_tokens: 0, max_tokens: null, tier_label: labels[intervals.length] || '',
|
||||
input_price: null, output_price: null, cache_write_price: null,
|
||||
|
||||
Reference in new issue
Block a user