Backend: one source channel → N output rows, one per platform that has user-visible groups. Each row carries a single platform, so the frontend can color/icon an entire row without mixing sources. - userAvailableChannel: add Platform field - new explodeChannelByPlatform helper; drop now-redundant collectGroupPlatforms Frontend: use the row platform to drive theming and stop repeating "ANTHROPIC" / "OPENAI" labels on every model chip. - api/channels.ts: UserAvailableChannel.platform - AvailableChannelsTable: name cell — PlatformBadge next to channel name (replaces the two-line name/description block; description moves to the badge's title tooltip); groups cell — each chip uses platformBadgeLightClass + PlatformIcon; model list passes show-platform=false + platform-hint to child chips - SupportedModelChip: chip bg/border driven by platformBadgeClass, leading PlatformIcon; platform-hint fallback when model.platform missing
66 lines
1.8 KiB
TypeScript
66 lines
1.8 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
|
||
}
|
||
|
||
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_output_price: number | null
|
||
per_request_price: number | null
|
||
intervals: UserPricingInterval[]
|
||
}
|
||
|
||
export interface UserSupportedModel {
|
||
name: string
|
||
platform: string
|
||
pricing: UserSupportedModelPricing | null
|
||
}
|
||
|
||
export interface UserAvailableChannel {
|
||
name: string
|
||
description: string
|
||
/**
|
||
* 所属平台(anthropic / openai / antigravity / gemini ...)。后端按平台把一个渠道
|
||
* 摊开成多条记录,因此此字段决定整行的配色与图标。
|
||
*/
|
||
platform: string
|
||
groups: UserAvailableGroup[]
|
||
supported_models: UserSupportedModel[]
|
||
}
|
||
|
||
/** 列出当前用户可见的「可用渠道」(与 /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
|