mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-11-04 08:43:20 +00:00
渠道 token 计费模式此前无法为图片输入 token 单独定价,gpt-image-2 图片编辑等请求的图像输入被按文本 input_price 计费。新增 channel_model_pricing.image_input_price 列及全链路支持。 后端: - 迁移 178:channel_model_pricing 新增 image_input_price 列 - ChannelModelPricing 新增 ImageInputPrice 字段,repo 读写、校验补齐 - model_pricing_resolver / GetModelPricingWithChannel 映射到 ImageInputPricePerToken;未配置时归零,由 computeTokenBreakdown 回退文本输入价(向后兼容,与 image_output_price 的渠道权威规则一致) - admin / 用户侧定价 DTO 与 model-pricing 自动填充接口补充该字段 前端: - 渠道定价表单新增「图片输入」价格输入(token 模式) - API 类型、表单模型、form↔API 换算、自动填充、用户侧模型定价卡展示 - zh/en i18n 标签 相关 #4386。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015wcJTKDddxXSQrepSs3wrU
82 lines
2.5 KiB
TypeScript
82 lines
2.5 KiB
TypeScript
/**
|
|
* User Channels API endpoints (non-admin)
|
|
* 用户侧「可用渠道」聚合查询:渠道 + 用户可访问的分组 + 支持模型(含定价)。
|
|
*/
|
|
|
|
import { apiClient } from './client'
|
|
import type { BillingMode } from '@/constants/channel'
|
|
|
|
export interface UserAvailableGroup {
|
|
id: number
|
|
name: string
|
|
platform: string
|
|
/** 'standard' | 'subscription' — 订阅分组视觉加深,和 API 密钥页保持一致。 */
|
|
subscription_type: string
|
|
/** 分组默认倍率。用户专属倍率(若有)通过 /groups/rates 获取后在前端 join。 */
|
|
rate_multiplier: number
|
|
peak_rate_enabled: boolean
|
|
peak_start: string
|
|
peak_end: string
|
|
peak_rate_multiplier: number
|
|
/** true = 专属分组(小范围授权);false = 公开分组。 */
|
|
is_exclusive: boolean
|
|
}
|
|
|
|
export interface UserPricingInterval {
|
|
min_tokens: number
|
|
max_tokens: number | null
|
|
tier_label?: string
|
|
input_price: number | null
|
|
output_price: number | null
|
|
cache_write_price: number | null
|
|
cache_read_price: number | null
|
|
per_request_price: number | null
|
|
}
|
|
|
|
export interface UserSupportedModelPricing {
|
|
billing_mode: BillingMode
|
|
input_price: number | null
|
|
output_price: number | null
|
|
cache_write_price: number | null
|
|
cache_read_price: number | null
|
|
image_input_price: number | null
|
|
image_output_price: number | null
|
|
per_request_price: number | null
|
|
intervals: UserPricingInterval[]
|
|
}
|
|
|
|
export interface UserSupportedModel {
|
|
name: string
|
|
platform: string
|
|
pricing: UserSupportedModelPricing | null
|
|
}
|
|
|
|
/**
|
|
* 渠道下单个平台的子视图:用户可访问的分组 + 该平台支持的模型。
|
|
* 后端把一个渠道按平台聚合成 sections,前端可以把渠道名作为 row-group
|
|
* 一次渲染,后面按 sections 顺序用 rowspan 铺开。
|
|
*/
|
|
export interface UserChannelPlatformSection {
|
|
platform: string
|
|
groups: UserAvailableGroup[]
|
|
supported_models: UserSupportedModel[]
|
|
}
|
|
|
|
export interface UserAvailableChannel {
|
|
name: string
|
|
description: string
|
|
platforms: UserChannelPlatformSection[]
|
|
}
|
|
|
|
/** 列出当前用户可见的「可用渠道」(与 /groups/available 保持一致,返回平数组)。 */
|
|
export async function getAvailable(options?: { signal?: AbortSignal }): Promise<UserAvailableChannel[]> {
|
|
const { data } = await apiClient.get<UserAvailableChannel[]>('/channels/available', {
|
|
signal: options?.signal
|
|
})
|
|
return data
|
|
}
|
|
|
|
export const userChannelsAPI = { getAvailable }
|
|
|
|
export default userChannelsAPI
|