1
0
Files
nex/frontend/src/api/client.ts
lanyuanxiaoyao 915b004924 feat: 初始化 AI Gateway 项目
实现支持 OpenAI 和 Anthropic 双协议的统一大模型 API 网关 MVP 版本,包含:
- OpenAI 和 Anthropic 协议代理
- 供应商和模型管理
- 用量统计
- 前端配置界面
2026-04-15 16:53:28 +08:00

130 lines
4.2 KiB
TypeScript

const API_BASE = 'http://localhost:9826/api';
export interface Provider {
id: string;
name: string;
api_key: string;
base_url: string;
enabled: boolean;
created_at: string;
updated_at: string;
}
export interface Model {
id: string;
provider_id: string;
model_name: string;
enabled: boolean;
created_at: string;
}
export interface UsageStats {
id: number;
provider_id: string;
model_name: string;
request_count: number;
date: string;
}
// Provider API
export async function listProviders(): Promise<Provider[]> {
const response = await fetch(`${API_BASE}/providers`);
if (!response.ok) throw new Error('Failed to fetch providers');
return response.json();
}
export async function createProvider(provider: Omit<Provider, 'created_at' | 'updated_at'>): Promise<Provider> {
const response = await fetch(`${API_BASE}/providers`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(provider),
});
if (!response.ok) throw new Error('Failed to create provider');
return response.json();
}
export async function updateProvider(id: string, updates: Partial<Provider>): Promise<Provider> {
const response = await fetch(`${API_BASE}/providers/${id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(updates),
});
if (!response.ok) throw new Error('Failed to update provider');
return response.json();
}
export async function deleteProvider(id: string): Promise<void> {
const response = await fetch(`${API_BASE}/providers/${id}`, { method: 'DELETE' });
if (!response.ok) throw new Error('Failed to delete provider');
}
// Model API
export async function listModels(providerId?: string): Promise<Model[]> {
const url = providerId ? `${API_BASE}/models?provider_id=${providerId}` : `${API_BASE}/models`;
const response = await fetch(url);
if (!response.ok) throw new Error('Failed to fetch models');
return response.json();
}
export async function createModel(model: Omit<Model, 'created_at'>): Promise<Model> {
const response = await fetch(`${API_BASE}/models`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(model),
});
if (!response.ok) throw new Error('Failed to create model');
return response.json();
}
export async function updateModel(id: string, updates: Partial<Model>): Promise<Model> {
const response = await fetch(`${API_BASE}/models/${id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(updates),
});
if (!response.ok) throw new Error('Failed to update model');
return response.json();
}
export async function deleteModel(id: string): Promise<void> {
const response = await fetch(`${API_BASE}/models/${id}`, { method: 'DELETE' });
if (!response.ok) throw new Error('Failed to delete model');
}
// Stats API
export async function getStats(params?: {
provider_id?: string;
model_name?: string;
start_date?: string;
end_date?: string;
}): Promise<UsageStats[]> {
const query = new URLSearchParams();
if (params?.provider_id) query.set('provider_id', params.provider_id);
if (params?.model_name) query.set('model_name', params.model_name);
if (params?.start_date) query.set('start_date', params.start_date);
if (params?.end_date) query.set('end_date', params.end_date);
const response = await fetch(`${API_BASE}/stats?${query}`);
if (!response.ok) throw new Error('Failed to fetch stats');
return response.json();
}
export async function getAggregatedStats(params?: {
provider_id?: string;
model_name?: string;
start_date?: string;
end_date?: string;
group_by?: 'provider' | 'model' | 'date';
}): Promise<any[]> {
const query = new URLSearchParams();
if (params?.provider_id) query.set('provider_id', params.provider_id);
if (params?.model_name) query.set('model_name', params.model_name);
if (params?.start_date) query.set('start_date', params.start_date);
if (params?.end_date) query.set('end_date', params.end_date);
if (params?.group_by) query.set('group_by', params.group_by);
const response = await fetch(`${API_BASE}/stats/aggregate?${query}`);
if (!response.ok) throw new Error('Failed to fetch aggregated stats');
return response.json();
}