/** * Admin Channels API endpoints * Handles channel management for administrators */ import { apiClient } from '../client' export type BillingMode = 'token' | 'per_request' | 'image' export interface PricingInterval { id?: number 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 sort_order: number } export interface ChannelModelPricing { id?: number platform: string models: string[] 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: PricingInterval[] } export interface Channel { id: number name: string description: string status: string billing_model_source: string // "requested" | "upstream" restrict_models: boolean group_ids: number[] model_pricing: ChannelModelPricing[] model_mapping: Record> // platform → {src→dst} created_at: string updated_at: string } export interface CreateChannelRequest { name: string description?: string group_ids?: number[] model_pricing?: ChannelModelPricing[] model_mapping?: Record> billing_model_source?: string restrict_models?: boolean } export interface UpdateChannelRequest { name?: string description?: string status?: string group_ids?: number[] model_pricing?: ChannelModelPricing[] model_mapping?: Record> billing_model_source?: string restrict_models?: boolean } interface PaginatedResponse { items: T[] total: number } /** * List channels with pagination */ export async function list( page: number = 1, pageSize: number = 20, filters?: { status?: string search?: string }, options?: { signal?: AbortSignal } ): Promise> { const { data } = await apiClient.get>('/admin/channels', { params: { page, page_size: pageSize, ...filters }, signal: options?.signal }) return data } /** * Get channel by ID */ export async function getById(id: number): Promise { const { data } = await apiClient.get(`/admin/channels/${id}`) return data } /** * Create a new channel */ export async function create(req: CreateChannelRequest): Promise { const { data } = await apiClient.post('/admin/channels', req) return data } /** * Update a channel */ export async function update(id: number, req: UpdateChannelRequest): Promise { const { data } = await apiClient.put(`/admin/channels/${id}`, req) return data } /** * Delete a channel */ export async function remove(id: number): Promise { await apiClient.delete(`/admin/channels/${id}`) } export interface ModelDefaultPricing { found: boolean input_price?: number // per-token price output_price?: number cache_write_price?: number cache_read_price?: number } export async function getModelDefaultPricing(model: string): Promise { const { data } = await apiClient.get('/admin/channels/model-pricing', { params: { model } }) return data } const channelsAPI = { list, getById, create, update, remove, getModelDefaultPricing } export default channelsAPI