feat: 初始化 AI Gateway 项目
实现支持 OpenAI 和 Anthropic 双协议的统一大模型 API 网关 MVP 版本,包含: - OpenAI 和 Anthropic 协议代理 - 供应商和模型管理 - 用量统计 - 前端配置界面
This commit is contained in:
129
frontend/src/api/client.ts
Normal file
129
frontend/src/api/client.ts
Normal file
@@ -0,0 +1,129 @@
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user