800802b8aa
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
|