实现支持 OpenAI 和 Anthropic 双协议的统一大模型 API 网关 MVP 版本,包含: - OpenAI 和 Anthropic 协议代理 - 供应商和模型管理 - 用量统计 - 前端配置界面
130 lines
4.2 KiB
TypeScript
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();
|
|
}
|