1971 lines
57 KiB
TypeScript
1971 lines
57 KiB
TypeScript
/**
|
|
|
|
* AIFlow API 客户端
|
|
|
|
* 统一管理所有前后端API请求
|
|
|
|
*/
|
|
|
|
const API_BASE = '/app/api';
|
|
|
|
|
|
|
|
// 从localStorage获取token
|
|
|
|
function getToken(): string | null {
|
|
|
|
return localStorage.getItem('aiflow_token');
|
|
|
|
}
|
|
|
|
|
|
|
|
// 通用请求方法
|
|
|
|
export async function request<T>(
|
|
|
|
endpoint: string,
|
|
|
|
options: RequestInit = {}
|
|
|
|
): Promise<{ code: number; data: T; message: string }> {
|
|
|
|
const token = getToken();
|
|
|
|
const headers: Record<string, string> = {
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
...(options.headers as Record<string, string> || {}),
|
|
|
|
};
|
|
|
|
if (token) {
|
|
|
|
headers['Authorization'] = `Bearer ${token}`;
|
|
|
|
}
|
|
|
|
const res = await fetch(`${API_BASE}${endpoint}`, {
|
|
|
|
...options,
|
|
|
|
headers,
|
|
|
|
});
|
|
|
|
if (res.status === 401) {
|
|
|
|
// 登录接口的401需要精确提示(用户名不存在 / 密码错误)
|
|
|
|
if (endpoint === '/auth/login') {
|
|
|
|
const err = await res.json().catch(() => ({ detail: '登录失败' }));
|
|
|
|
const error: any = new Error(err.detail || '登录失败');
|
|
|
|
error.status = 401;
|
|
|
|
error.detail = err.detail;
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
// 其他接口的401 = token过期/未登录,清除状态并跳转
|
|
|
|
localStorage.removeItem('aiflow_token');
|
|
|
|
localStorage.removeItem('aiflow_user');
|
|
|
|
window.location.href = '/login';
|
|
|
|
throw new Error('未登录');
|
|
|
|
}
|
|
|
|
if (!res.ok) {
|
|
|
|
const err = await res.json().catch(() => ({ detail: '请求失败' }));
|
|
|
|
const error: any = new Error(err.detail || err.message || '请求失败');
|
|
|
|
error.status = res.status;
|
|
|
|
error.response = { status: res.status, data: err };
|
|
|
|
error.detail = err.detail;
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
return res.json();
|
|
|
|
}
|
|
|
|
|
|
|
|
// GET请求
|
|
|
|
function get<T>(endpoint: string): Promise<{ code: number; data: T; message: string }> {
|
|
|
|
return request<T>(endpoint);
|
|
|
|
}
|
|
|
|
|
|
|
|
// POST请求
|
|
|
|
function post<T>(endpoint: string, body?: any): Promise<{ code: number; data: T; message: string }> {
|
|
|
|
return request<T>(endpoint, {
|
|
|
|
method: 'POST',
|
|
|
|
body: body ? JSON.stringify(body) : undefined,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// PUT请求
|
|
|
|
function put<T>(endpoint: string, body?: any): Promise<{ code: number; data: T; message: string }> {
|
|
|
|
return request<T>(endpoint, {
|
|
|
|
method: 'PUT',
|
|
|
|
body: body ? JSON.stringify(body) : undefined,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// DELETE请求
|
|
|
|
function del<T>(endpoint: string): Promise<{ code: number; data: T; message: string }> {
|
|
|
|
return request<T>(endpoint, { method: 'DELETE' });
|
|
|
|
}
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 认证相关API
|
|
|
|
// ============================================================
|
|
|
|
export const authAPI = {
|
|
|
|
login: (username: string, password: string) =>
|
|
|
|
post<any>('/auth/login', { username, password }),
|
|
|
|
register: (data: { username: string; password: string; email?: string; phone?: string }) =>
|
|
|
|
post<any>('/auth/register', data),
|
|
|
|
getMe: () => get<any>('/auth/me'),
|
|
|
|
logout: () => post<any>('/auth/logout'),
|
|
|
|
getSettings: () => get<any>('/auth/settings'),
|
|
|
|
sendCode: (phone: string, purpose: string) =>
|
|
post<any>('/auth/send-code', { phone, purpose }),
|
|
|
|
resetPassword: (data: { phone: string; code: string; new_password: string }) =>
|
|
post<any>('/auth/reset-password', data),
|
|
|
|
};
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 聊天相关API
|
|
|
|
// ============================================================
|
|
|
|
export const chatAPI = {
|
|
|
|
getConversations: (status?: string) =>
|
|
|
|
get<any[]>(`/chat/conversations${status ? `?status=${status}` : ''}`),
|
|
|
|
createConversation: (data: { title: string; model_id?: string }) =>
|
|
|
|
post<any>('/chat/conversations', data),
|
|
|
|
updateConversation: (id: string, data: any) =>
|
|
|
|
put<any>(`/chat/conversations/${id}`, data),
|
|
|
|
deleteConversation: (id: string) =>
|
|
|
|
del<any>(`/chat/conversations/${id}`),
|
|
|
|
getMessages: (convId: string) =>
|
|
|
|
get<any[]>(`/chat/conversations/${convId}/messages`),
|
|
|
|
sendMessage: (convId: string, data: { content: string; model_id?: string; agent_ids?: string[]; skill_ids?: string[]; knowledge_base_ids?: string[]; use_tools?: boolean }) =>
|
|
|
|
post<any>(`/chat/conversations/${convId}/messages`, data),
|
|
|
|
clearContext: (convId: string) =>
|
|
|
|
post<any>(`/chat/conversations/${convId}/clear`),
|
|
|
|
convertToKnowledgeGraph: (convId: string) =>
|
|
|
|
post<any>(`/chat/conversations/${convId}/to-knowledge-graph/`),
|
|
|
|
getModels: () => get<any[]>('/chat/models'),
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 知识库相关API
|
|
|
|
// ============================================================
|
|
|
|
export const knowledgeAPI = {
|
|
|
|
getBases: () => get<any[]>('/knowledge/bases'),
|
|
|
|
createBase: (data: any) => post<any>('/knowledge/bases', data),
|
|
|
|
getBase: (id: string) => get<any>(`/knowledge/bases/${id}`),
|
|
|
|
updateBase: (id: string, data: any) => put<any>(`/knowledge/bases/${id}`, data),
|
|
|
|
deleteBase: (id: string) => del<any>(`/knowledge/bases/${id}`),
|
|
|
|
getDocuments: (baseId: string) => get<any>(`/knowledge/bases/${baseId}/documents`),
|
|
|
|
getDocument: (baseId: string, docId: string) => get<any>(`/knowledge/bases/${baseId}/documents/${docId}`),
|
|
|
|
uploadDocument: (baseId: string, data: any) => post<any>(`/knowledge/bases/${baseId}/documents`, data),
|
|
|
|
deleteDocument: (baseId: string, docId: string) => del<any>(`/knowledge/bases/${baseId}/documents/${docId}`),
|
|
|
|
getDirectories: () => get<any[]>('/knowledge/directories'),
|
|
|
|
createDirectory: (data: any) => post<any>('/knowledge/directories', data),
|
|
|
|
buildGraph: (baseId: string) => post<any>(`/knowledge/bases/${baseId}/build-graph`),
|
|
|
|
getGraph: (baseId: string) => get<any>(`/knowledge/bases/${baseId}/graph`),
|
|
|
|
searchQA: (baseId: string, question: string) => post<any>('/knowledge/qa', { base_id: baseId, question }),
|
|
|
|
searchDocuments: (baseId: string, keyword: string) => get<any[]>(`/knowledge/bases/${baseId}/search?keyword=${encodeURIComponent(keyword)}`),
|
|
|
|
};
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 应用市场相关API
|
|
|
|
// ============================================================
|
|
|
|
export const marketAPI = {
|
|
|
|
getApps: (params?: { type?: string; source?: string; search?: string; page?: number; page_size?: number }) => {
|
|
|
|
const searchParams = new URLSearchParams();
|
|
|
|
if (params?.type) searchParams.set('type', params.type);
|
|
|
|
if (params?.source) searchParams.set('source', params.source);
|
|
|
|
if (params?.search) searchParams.set('search', params.search);
|
|
|
|
if (params?.page) searchParams.set('page', String(params.page));
|
|
|
|
if (params?.page_size) searchParams.set('page_size', String(params.page_size));
|
|
|
|
const qs = searchParams.toString();
|
|
|
|
return get<any>(`/market/apps${qs ? `?${qs}` : ''}`);
|
|
|
|
},
|
|
|
|
getApp: (id: string) => get<any>(`/market/apps/${id}`),
|
|
|
|
createApp: (data: any) => post<any>('/market/apps', data),
|
|
|
|
purchaseApp: (id: string) => post<any>(`/market/apps/${id}/purchase`),
|
|
|
|
installApp: (id: string) => post<any>(`/market/apps/${id}/install`),
|
|
|
|
uninstallApp: (id: string) => del<any>(`/market/apps/${id}/uninstall`),
|
|
|
|
reviewApp: (id: string, data: { rating: number; content?: string }) =>
|
|
|
|
post<any>(`/market/apps/${id}/review`, data),
|
|
|
|
getMyApps: () => get<any[]>('/market/my-apps'),
|
|
|
|
getReviews: (appId: string) => get<any[]>(`/market/reviews/${appId}`),
|
|
|
|
};
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// Token相关API
|
|
|
|
// ============================================================
|
|
|
|
export const tokenAPI = {
|
|
|
|
getOverview: () => get<any>('/token/overview'),
|
|
|
|
getRankings: () => get<any>('/token/rankings'),
|
|
|
|
getLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
const qs = sp.toString();
|
|
|
|
return get<any[]>(`/token/logs${qs ? `?${qs}` : ''}`);
|
|
|
|
},
|
|
|
|
getBalance: () => get<any>('/token/balance'),
|
|
|
|
recharge: (amount: number) => post<any>('/token/recharge', { amount }),
|
|
|
|
};
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 付费相关API
|
|
|
|
// ============================================================
|
|
|
|
export const paymentAPI = {
|
|
|
|
getPlans: () => get<any[]>('/payment/plans'),
|
|
|
|
createOrder: (data: any) => post<any>('/payment/orders', data),
|
|
|
|
getOrders: (status?: string) => get<any[]>(`/payment/orders${status ? `?status=${status}` : ''}`),
|
|
|
|
getOrder: (id: string) => get<any>(`/payment/orders/${id}`),
|
|
|
|
payOrder: (id: string, method?: string) => post<any>(`/payment/orders/${id}/pay`, { payment_method: method }),
|
|
|
|
getCoupons: () => get<any[]>('/payment/coupons'),
|
|
|
|
useCoupon: (code: string) => post<any>('/payment/coupons/use', { code }),
|
|
|
|
getServices: () => get<any[]>('/payment/services'),
|
|
|
|
createCustomOrder: (data: any) => post<any>('/payment/custom-services', data),
|
|
|
|
createServiceRequest: (data: any) => post<any>('/payment/service-requests', data),
|
|
|
|
};
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 个人中心相关API
|
|
|
|
// ============================================================
|
|
|
|
export const profileAPI = {
|
|
|
|
getProfile: () => get<any>('/profile/'),
|
|
|
|
updateProfile: (data: any) => put<any>('/profile/', data),
|
|
|
|
updatePassword: (data: { old_password: string; new_password: string }) =>
|
|
|
|
put<any>('/profile/password', data),
|
|
|
|
getLoginLogs: () => get<any[]>('/profile/login-logs'),
|
|
|
|
getApiKeys: () => get<any[]>('/profile/api-keys'),
|
|
|
|
createApiKey: (name?: string) => post<any>('/profile/api-keys', { name }),
|
|
|
|
updateApiKey: (id: string, status: string) => put<any>(`/profile/api-keys/${id}`, { status }),
|
|
|
|
getMembership: () => get<any>('/profile/membership'),
|
|
|
|
getPurchasedApps: () => get<any[]>('/profile/purchased-apps'),
|
|
|
|
};
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 通知相关API
|
|
|
|
// ============================================================
|
|
|
|
export const notificationAPI = {
|
|
|
|
getNotifications: (params?: { type?: string; page?: number }) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params?.type) sp.set('type', params.type);
|
|
|
|
if (params?.page) sp.set('page', String(params.page));
|
|
|
|
const qs = sp.toString();
|
|
|
|
return get<any[]>(`/notifications/${qs ? `?${qs}` : ''}`);
|
|
|
|
},
|
|
|
|
markRead: (id: string) => put<any>(`/notifications/${id}/read`),
|
|
|
|
markAllRead: () => put<any>('/notifications/read-all'),
|
|
|
|
getUnreadCount: () => get<any>('/notifications/unread-count'),
|
|
|
|
};
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 资产管理相关API
|
|
|
|
// ============================================================
|
|
|
|
export const assetsAPI = {
|
|
|
|
getAssets: (params?: { category?: string; page?: number; page_size?: number }) => {
|
|
const qs: string[] = [];
|
|
if (params?.category) qs.push(`category=${encodeURIComponent(params.category)}`);
|
|
if (params?.page) qs.push(`page=${params.page}`);
|
|
if (params?.page_size) qs.push(`page_size=${params.page_size}`);
|
|
const q = qs.length ? `?${qs.join('&')}` : '';
|
|
return get<any>(`/assets/${q}`);
|
|
},
|
|
|
|
createAsset: (data: any) => post<any>('/assets/', data),
|
|
|
|
getAsset: (id: string) => get<any>(`/assets/${id}`),
|
|
|
|
updateAsset: (id: string, data: any) => put<any>(`/assets/${id}`, data),
|
|
|
|
deleteAsset: (id: string) => del<any>(`/assets/${id}`),
|
|
|
|
getCategories: () => get<any[]>('/assets/categories'),
|
|
|
|
getNovelChapters: (novelId: string) => get<any[]>(`/assets/novels/${novelId}/chapters`),
|
|
|
|
addChapter: (novelId: string, data: any) => post<any>(`/assets/novels/${novelId}/chapters`, data),
|
|
|
|
};
|
|
|
|
|
|
|
|
// ============================================================
|
|
|
|
// 后台管理API
|
|
|
|
// ============================================================
|
|
|
|
export const adminAPI = {
|
|
|
|
// 仪表盘
|
|
|
|
getStats: () => get<any>('/admin/dashboard/stats'),
|
|
|
|
getRecentLogs: () => get<any[]>('/admin/dashboard/recent-logs'),
|
|
|
|
getRecentAudit: () => get<any[]>('/admin/dashboard/recent-audit'),
|
|
|
|
getDailyStats: (days?: number) => get<{ days: number; data: Array<{ date: string; tokens: number }> }>(`/admin/dashboard/daily-stats${days ? `?days=${days}` : ''}`),
|
|
|
|
// 用户管理
|
|
|
|
getUsers: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any[]>(`/admin/users/${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
getUser: (id: string) => get<any>(`/admin/users/${id}`),
|
|
|
|
banUser: (id: string) => put<any>(`/admin/users/${id}/ban`),
|
|
|
|
unbanUser: (id: string) => put<any>(`/admin/users/${id}/unban`),
|
|
|
|
getRegisterSettings: () => get<any>('/admin/users/register-settings'),
|
|
|
|
updateRegisterSettings: (data: any) => put<any>('/admin/users/register-settings', data),
|
|
|
|
// 模型管理
|
|
|
|
getProviders: () => get<any[]>('/admin/models/providers'),
|
|
|
|
addProvider: (data: any) => post<any>('/admin/models/providers', data),
|
|
|
|
updateProvider: (id: string, data: any) => put<any>(`/admin/models/providers/${id}`, data),
|
|
|
|
deleteProvider: (id: string) => del<any>(`/admin/models/providers/${id}`),
|
|
|
|
fetchModels: (id: string) => post<any>(`/admin/models/providers/${id}/fetch-models`),
|
|
|
|
addModels: (id: string, modelIds: string[]) => post<any>(`/admin/models/providers/${id}/add-models`, { model_ids: modelIds }),
|
|
|
|
getProtocols: () => get<any[]>('/admin/models/protocols'),
|
|
|
|
getAdminModels: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/models/${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
addModel: (data: any) => post<any>('/admin/models/', data),
|
|
|
|
updateModel: (id: string, data: any) => put<any>(`/admin/models/${id}`, data),
|
|
|
|
deleteModel: (id: string) => del<any>(`/admin/models/${id}`),
|
|
|
|
toggleModel: (id: string, isEnabled: boolean) => put<any>(`/admin/models/${id}/toggle?is_enabled=${isEnabled}`),
|
|
|
|
setDefaultModel: (id: string) => put<any>(`/admin/models/${id}/set-default`),
|
|
|
|
// 按能力默认模型(Auto 自动模式使用)
|
|
getCapabilities: () => get<any[]>('/admin/models/capabilities'),
|
|
getCapabilityDefaults: () => get<any>('/admin/models/capability-defaults'),
|
|
setCapabilityDefault: (capability: string, modelId: string | null) =>
|
|
put<any>('/admin/models/capability-defaults', { capability, model_id: modelId }),
|
|
|
|
// Phase 2: Enhanced model management
|
|
|
|
testModelConnection: (id: string) => post<any>(`/admin/models/${id}/test-connection`),
|
|
|
|
testAllModels: () => post<any>('/admin/models/test-all'),
|
|
|
|
fetchProviderModels: (id: string) => post<any>(`/admin/models/providers/${id}/fetch-models`),
|
|
|
|
createAdminModel: (data: any) => post<any>('/admin/models/', data),
|
|
|
|
updateAdminModel: (id: string, data: any) => put<any>(`/admin/models/${id}`, data),
|
|
|
|
deleteAdminModel: (id: string) => del<any>(`/admin/models/${id}`),
|
|
|
|
getModelStats: () => get<any>('/admin/models/stats'),
|
|
|
|
// 网站设置
|
|
|
|
getSiteSettings: () => get<any>('/admin/settings/site'),
|
|
|
|
updateSiteSettings: (data: any) => put<any>('/admin/settings/site', data),
|
|
|
|
getEmailConfig: () => get<any>('/admin/settings/email'),
|
|
|
|
updateEmailConfig: (data: any) => put<any>('/admin/settings/email', data),
|
|
|
|
testEmail: (params?: { test_to?: string; test_subject?: string; test_body?: string }) => {
|
|
|
|
const qs = new URLSearchParams();
|
|
|
|
if (params?.test_to) qs.set('test_to', params.test_to);
|
|
|
|
if (params?.test_subject) qs.set('test_subject', params.test_subject);
|
|
|
|
if (params?.test_body) qs.set('test_body', params.test_body);
|
|
|
|
const qstr = qs.toString();
|
|
|
|
return post<any>(`/admin/settings/email/test${qstr ? `?${qstr}` : ''}`);
|
|
|
|
},
|
|
|
|
generateEmailContent: (topic: string) => post<any>(`/admin/settings/email/generate-content?topic=${encodeURIComponent(topic)}`),
|
|
|
|
getSmsConfig: () => get<any>('/admin/settings/sms'),
|
|
|
|
updateSmsConfig: (data: any) => put<any>('/admin/settings/sms', data),
|
|
|
|
testSms: () => post<any>('/admin/settings/sms/test'),
|
|
|
|
getSmsBalance: () => post<any>('/admin/settings/sms/balance'),
|
|
|
|
// 支付配置
|
|
|
|
getPaymentConfigs: () => get<any[]>('/admin/payment/configs'),
|
|
|
|
updatePaymentConfig: (id: string, data: any) => put<any>(`/admin/payment/configs/${id}`, data),
|
|
|
|
getAdminOrders: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any[]>(`/admin/payment/orders${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
refundOrder: (id: string) => put<any>(`/admin/payment/orders/${id}/refund`),
|
|
|
|
// 增值服务
|
|
|
|
getServices: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any[]>(`/admin/services/${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
addService: (data: any) => post<any>('/admin/services/', data),
|
|
|
|
updateService: (id: string, data: any) => put<any>(`/admin/services/${id}`, data),
|
|
|
|
deleteService: (id: string) => del<any>(`/admin/services/${id}`),
|
|
|
|
getCustomOrders: (status?: string) => get<any[]>(`/admin/services/custom-orders${status ? `?status=${status}` : ''}`),
|
|
|
|
updateCustomOrder: (id: string, data: any) => put<any>(`/admin/services/custom-orders/${id}`, data),
|
|
|
|
getCustomRequests: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any[]>(`/admin/services/custom-requests${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
updateCustomRequest: (id: string, data: any) => put<any>(`/admin/services/custom-requests/${id}`, data),
|
|
|
|
getAvailableAgents: () => get<any[]>('/admin/services/agents'),
|
|
|
|
assignAgentToService: (id: string, agentId: string) => put<any>(`/admin/services/${id}/agent?agent_id=${agentId}`),
|
|
|
|
// 会员管理(增强版)
|
|
|
|
getPlans: () => get<any[]>('/admin/membership/plans'),
|
|
|
|
addPlan: (params: string) => post<any>(`/admin/membership/plans${params}`),
|
|
|
|
updatePlan: (id: string, params: string) => put<any>(`/admin/membership/plans/${id}${params}`),
|
|
|
|
deletePlan: (id: string) => del<any>(`/admin/membership/plans/${id}`),
|
|
|
|
getSubscriptions: (page?: number) => get<any>(`/admin/membership/subscriptions${page ? `?page=${page}` : ''}`),
|
|
|
|
getAutomationRules: () => get<any>('/admin/membership/automation-rules'),
|
|
|
|
getBenefitsComparison: () => get<any>('/admin/membership/benefits-comparison'),
|
|
|
|
getMembershipConfigs: () => get<any[]>('/admin/membership/global-configs'),
|
|
|
|
updateMembershipConfig: (key: string, params: string) => put<any>(`/admin/membership/global-configs/${key}${params}`),
|
|
|
|
getUserMemberships: (page?: number, planId?: string, status?: string) => {
|
|
|
|
const p = new URLSearchParams();
|
|
|
|
if (page) p.append('page', String(page));
|
|
|
|
if (planId) p.append('plan_id', planId);
|
|
|
|
if (status) p.append('status', status);
|
|
|
|
const qs = p.toString();
|
|
|
|
return get<any>(`/admin/membership/user-memberships${qs ? `?${qs}` : ''}`);
|
|
|
|
},
|
|
|
|
assignPlan: (userId: string, planId: string, days: number) => put<any>(`/admin/membership/users/${userId}/assign-plan?plan_id=${planId}&duration_days=${days}`),
|
|
|
|
getPaymentLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any[]>(`/admin/logs/payment-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
getAuditLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any[]>(`/admin/logs/audit-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
// 新增:日志统计
|
|
|
|
getLogStats: () => get<any>('/admin/logs/stats'),
|
|
|
|
// 新增:API调用统计
|
|
|
|
getApiStats: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/logs/api-stats${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
// 新增:慢请求记录
|
|
|
|
getSlowRequests: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/logs/slow-requests${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
// 新增:操作类型枚举
|
|
|
|
getActionTypes: () => get<any>('/admin/logs/action-types'),
|
|
|
|
// 新增:审计日志导出
|
|
|
|
exportAuditLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/logs/export/audit-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
exportOperationLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/logs/export/operations${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
exportTokenLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/logs/export/token-logs${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
getRiskRules: () => get<any[]>('/admin/logs/risk-rules'),
|
|
|
|
addRiskRule: (data: any) => post<any>('/admin/logs/risk-rules', data),
|
|
|
|
updateRiskRule: (id: string, data: any) => put<any>(`/admin/logs/risk-rules/${id}`, data),
|
|
|
|
deleteRiskRule: (id: string) => del<any>(`/admin/logs/risk-rules/${id}`),
|
|
|
|
// 技能管理 (Phase 2.2)
|
|
|
|
getAdminSkills: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v !== undefined && v !== null && v !== '') sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/skills/${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
getAdminSkill: (id: string) => get<any>(`/admin/skills/${id}`),
|
|
|
|
createAdminSkill: (data: any) => post<any>('/admin/skills/', data),
|
|
|
|
updateAdminSkill: (id: string, data: any) => put<any>(`/admin/skills/${id}`, data),
|
|
|
|
deleteAdminSkill: (id: string) => del<any>(`/admin/skills/${id}`),
|
|
|
|
changeAdminSkillState: (id: string, data: any) => put<any>(`/admin/skills/${id}/state`, data),
|
|
|
|
getAdminSkillVersions: (id: string) => get<any>(`/admin/skills/${id}/versions`),
|
|
|
|
rollbackAdminSkill: (id: string, data: any) => post<any>(`/admin/skills/${id}/rollback`, data),
|
|
|
|
publishAdminSkill: (id: string, data: any) => post<any>(`/admin/skills/${id}/publish`, data),
|
|
|
|
unpublishAdminSkill: (id: string) => post<any>(`/admin/skills/${id}/unpublish`),
|
|
|
|
getAdminSkillsStats: () => get<any>('/admin/skills/stats/overview'),
|
|
|
|
// 智能体管理 (Phase 2.3)
|
|
|
|
getAdminAgents: (params?: any) => {
|
|
|
|
const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : '';
|
|
|
|
return get<any>(`/admin/agents/${query}`);
|
|
|
|
},
|
|
|
|
getAdminAgent: (id: string) => get<any>(`/admin/agents/${id}`),
|
|
|
|
createAdminAgent: (data: any) => post<any>('/admin/agents/', data),
|
|
|
|
updateAdminAgent: (id: string, data: any) => put<any>(`/admin/agents/${id}`, data),
|
|
|
|
deleteAdminAgent: (id: string) => del<any>(`/admin/agents/${id}`),
|
|
|
|
toggleAdminAgent: (id: string, isActive: boolean) => put<any>(`/admin/agents/${id}/toggle`, { is_active: isActive }),
|
|
|
|
getAdminAgentsStats: () => get<any>('/admin/agents/stats/overview'),
|
|
|
|
getAdminAgentReviews: (id: string) => get<any>(`/admin/agents/${id}/reviews`),
|
|
|
|
getAdminAvailableSkills: (params?: any) => {
|
|
|
|
const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : '';
|
|
|
|
return get<any>(`/admin/agents/available/skills${query}`);
|
|
|
|
},
|
|
|
|
getAdminAvailableModels: (params?: any) => {
|
|
|
|
const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : '';
|
|
|
|
return get<any>(`/admin/agents/available/models${query}`);
|
|
|
|
},
|
|
|
|
// 知识库管理 (Phase 2.4)
|
|
|
|
getAdminKnowledgeStats: () => get<any>('/admin/knowledge/stats/overview'),
|
|
|
|
getAdminKnowledge: (params?: any) => {
|
|
|
|
const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : '';
|
|
|
|
return get<any>(`/admin/knowledge/${query}`);
|
|
|
|
},
|
|
|
|
getAdminKnowledgeDetail: (id: string) => get<any>(`/admin/knowledge/${id}`),
|
|
|
|
createAdminKnowledge: (data: any) => post<any>('/admin/knowledge/', data),
|
|
|
|
updateAdminKnowledge: (id: string, data: any) => put<any>(`/admin/knowledge/${id}`, data),
|
|
|
|
deleteAdminKnowledge: (id: string) => del<any>(`/admin/knowledge/${id}`),
|
|
|
|
toggleAdminKnowledge: (id: string, isActive: boolean) => put<any>(`/admin/knowledge/${id}/toggle`, { is_active: isActive }),
|
|
|
|
getAdminKnowledgeDocs: (kbId: string, params?: any) => {
|
|
|
|
const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : '';
|
|
|
|
return get<any>(`/admin/knowledge/${kbId}/documents${query}`);
|
|
|
|
},
|
|
|
|
deleteAdminKnowledgeDoc: (kbId: string, docId: string) => del<any>(`/admin/knowledge/${kbId}/documents/${docId}`),
|
|
|
|
getAdminKnowledgeExtServices: () => get<any>('/admin/knowledge/external/services'),
|
|
|
|
createAdminKnowledgeExtService: (data: any) => post<any>('/admin/knowledge/external/services', data),
|
|
|
|
updateAdminKnowledgeExtService: (id: string, data: any) => put<any>(`/admin/knowledge/external/services/${id}`, data),
|
|
|
|
deleteAdminKnowledgeExtService: (id: string) => del<any>(`/admin/knowledge/external/services/${id}`),
|
|
|
|
checkAdminKnowledgeExtStatus: (id: string) => get<any>(`/admin/knowledge/external/services/${id}/status`),
|
|
|
|
syncAdminKnowledge: (kbId: string, data: any) => post<any>(`/admin/knowledge/external/sync/${kbId}`, data),
|
|
|
|
batchDeleteAdminKnowledge: (ids: string[]) => post<any>('/admin/knowledge/batch/delete', ids),
|
|
|
|
// OSS存储配置 (Phase 3.1)
|
|
|
|
getAssetStats: () => get<any>('/admin/assets/stats'),
|
|
|
|
getAdminAssets: (query: string) => get<any>(`/admin/assets/?${query}`),
|
|
|
|
deleteAdminAsset: (id: string) => del<any>(`/admin/assets/${id}`),
|
|
|
|
getAssetActivity: () => get<any>('/admin/assets/activity'),
|
|
|
|
getAdminStorageStats: () => get<any>('/admin/storage/stats/overview'),
|
|
|
|
getAdminStorageConfigs: (params?: any) => {
|
|
|
|
const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : '';
|
|
|
|
return get<any>(`/admin/storage/${query}`);
|
|
|
|
},
|
|
|
|
getAdminStorageConfig: (id: string) => get<any>(`/admin/storage/${id}`),
|
|
|
|
createAdminStorageConfig: (data: any) => post<any>('/admin/storage/', data),
|
|
|
|
updateAdminStorageConfig: (id: string, data: any) => put<any>(`/admin/storage/${id}`, data),
|
|
|
|
deleteAdminStorageConfig: (id: string) => del<any>(`/admin/storage/${id}`),
|
|
|
|
toggleAdminStorageConfig: (id: string) => put<any>(`/admin/storage/${id}/toggle`),
|
|
|
|
setDefaultAdminStorageConfig: (id: string) => put<any>(`/admin/storage/${id}/set-default`),
|
|
|
|
testAdminStorageConfig: (data: any) => post<any>('/admin/storage/test', data),
|
|
|
|
getAdminStorageUsage: (id: string) => get<any>(`/admin/storage/${id}/usage`),
|
|
|
|
// Storage Quota APIs (Phase C5)
|
|
|
|
getStorageQuotaOverview: () => get<any>('/admin/storage/quota/overview'),
|
|
|
|
getStorageQuotaUsers: (params?: any) => {
|
|
|
|
if (params) {
|
|
|
|
const query = Object.entries(params).map(([k, v]) => v !== undefined && v !== '' && v !== null ? `${k}=${encodeURIComponent(String(v))}` : '').filter(Boolean).join('&');
|
|
|
|
return get<any>(`/admin/storage/quota/users${query ? '?' + query : ''}`);
|
|
|
|
}
|
|
|
|
return get<any>('/admin/storage/quota/users');
|
|
|
|
},
|
|
|
|
getStorageQuotaUser: (userId: string) => get<any>(`/admin/storage/quota/users/${userId}`),
|
|
|
|
adjustStorageQuota: (userId: string, data: any) => put<any>(`/admin/storage/quota/users/${userId}`, data),
|
|
|
|
recalcStorageQuota: (userId: string) => post<any>(`/admin/storage/quota/recalculate/${userId}`, {}),
|
|
|
|
initAllStorageQuotas: () => post<any>('/admin/storage/quota/init-all', {}),
|
|
|
|
|
|
|
|
// 自动化任务调度 (Phase 3.2)
|
|
|
|
getAdminAutomationStats: () => get<any>('/admin/automation/stats/overview'),
|
|
|
|
getAdminAutomationTasks: (params?: any) => {
|
|
|
|
const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : '';
|
|
|
|
return get<any>(`/admin/automation/${query}`);
|
|
|
|
},
|
|
|
|
getAdminAutomationTask: (id: string) => get<any>(`/admin/automation/${id}`),
|
|
|
|
createAdminAutomationTask: (data: any) => post<any>('/admin/automation/', data),
|
|
|
|
updateAdminAutomationTask: (id: string, data: any) => put<any>(`/admin/automation/${id}`, data),
|
|
|
|
deleteAdminAutomationTask: (id: string) => del<any>(`/admin/automation/${id}`),
|
|
|
|
toggleAdminAutomationTask: (id: string) => put<any>(`/admin/automation/${id}/toggle`),
|
|
|
|
executeAdminAutomationTask: (id: string) => post<any>(`/admin/automation/${id}/execute`),
|
|
|
|
getAdminAutomationTaskHistory: (id: string, params?: any) => {
|
|
|
|
const query = params ? '?' + Object.entries(params).filter(([_, v]) => v !== undefined && v !== '').map(([k, v]) => `${k}=${v}`).join('&') : '';
|
|
|
|
return get<any>(`/admin/automation/${id}/history${query}`);
|
|
|
|
},
|
|
|
|
// MCP Server Management
|
|
|
|
getAdminMcpStats: () => get<any>('/admin/mcp/stats/overview'),
|
|
|
|
getAdminMcpServers: (params?: any) => {
|
|
|
|
const query = new URLSearchParams(params).toString();
|
|
|
|
return get<any>(`/admin/mcp/${query ? '?' + query : ''}`);
|
|
|
|
},
|
|
|
|
getAdminMcpServer: (id: string) => get<any>(`/admin/mcp/${id}`),
|
|
|
|
createAdminMcpServer: (data: any) => post<any>('/admin/mcp/', data),
|
|
|
|
updateAdminMcpServer: (id: string, data: any) => put<any>(`/admin/mcp/${id}`, data),
|
|
|
|
deleteAdminMcpServer: (id: string) => del<any>(`/admin/mcp/${id}`),
|
|
|
|
toggleAdminMcpServer: (id: string) => put<any>(`/admin/mcp/${id}/toggle`),
|
|
|
|
testAdminMcpServer: (id: string, data?: any) => post<any>(`/admin/mcp/${id}/test`, data || {}),
|
|
|
|
getAdminMcpServerTools: (id: string) => get<any>(`/admin/mcp/${id}/tools`),
|
|
|
|
getAdminMcpServerResources: (id: string) => get<any>(`/admin/mcp/${id}/resources`),
|
|
|
|
// Developer API Management
|
|
|
|
getAdminDeveloperStats: () => get<any>('/admin/developer/stats/overview'),
|
|
|
|
getAdminApiKeys: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/developer/api-keys${sp.toString() ? '?' + sp.toString() : ''}`);
|
|
|
|
},
|
|
|
|
createAdminApiKey: (data: any) => post<any>('/admin/developer/api-keys/', data),
|
|
|
|
updateAdminApiKey: (id: string, data: any) => put<any>(`/admin/developer/api-keys/${id}`, data),
|
|
|
|
revokeAdminApiKey: (id: string) => post<any>(`/admin/developer/api-keys/${id}/revoke`),
|
|
|
|
deleteAdminApiKey: (id: string) => del<any>(`/admin/developer/api-keys/${id}`),
|
|
|
|
getAdminOpenApiClients: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/developer/openapi-clients${sp.toString() ? '?' + sp.toString() : ''}`);
|
|
|
|
},
|
|
|
|
createAdminOpenApiClient: (data: any) => post<any>('/admin/developer/openapi-clients/', data),
|
|
|
|
updateAdminOpenApiClient: (id: string, data: any) => put<any>(`/admin/developer/openapi-clients/${id}`, data),
|
|
|
|
resetAdminOpenApiClientSecret: (id: string) => post<any>(`/admin/developer/openapi-clients/${id}/reset-secret`),
|
|
|
|
deleteAdminOpenApiClient: (id: string) => del<any>(`/admin/developer/openapi-clients/${id}`),
|
|
|
|
getAdminCallStats: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/developer/call-stats${sp.toString() ? '?' + sp.toString() : ''}`);
|
|
|
|
},
|
|
|
|
getAdminCallStatsOverview: () => get<any>('/admin/developer/call-stats/overview'),
|
|
|
|
getAdminSlowLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/developer/slow-logs${sp.toString() ? '?' + sp.toString() : ''}`);
|
|
|
|
},
|
|
|
|
clearAdminSlowLogs: () => del<any>('/admin/developer/slow-logs'),
|
|
|
|
getAdminSlowLogsStats: () => get<any>('/admin/developer/slow-logs/stats'),
|
|
|
|
// AI App Management
|
|
|
|
getAIAppStats: () => get<any>('/admin/apps/stats/overview'),
|
|
|
|
getAIApps: (params?: string) => get<any>('/admin/apps/apps' + (params ? '?' + params : '')),
|
|
|
|
getAIApp: (id: string) => get<any>('/admin/apps/apps/' + id),
|
|
|
|
createAIApp: (data: any) => post<any>('/admin/apps/apps', data),
|
|
|
|
updateAIApp: (id: string, data: any) => put<any>('/admin/apps/apps/' + id, data),
|
|
|
|
deleteAIApp: (id: string) => del<any>('/admin/apps/apps/' + id),
|
|
|
|
aiAppLifecycle: (id: string, action: string) => post<any>('/admin/apps/apps/' + id + '/' + action, {}),
|
|
|
|
getAIAppVersions: (id: string) => get<any>('/admin/apps/apps/' + id + '/versions'),
|
|
|
|
getAIAppAnalytics: (id: string) => get<any>('/admin/apps/apps/' + id + '/analytics'),
|
|
|
|
getAIAppTemplates: () => get<any>('/admin/apps/templates'),
|
|
|
|
createAIAppTemplate: (data: any) => post<any>('/admin/apps/templates', data),
|
|
|
|
createAIAppFromTemplate: (templateId: string, data: any) => post<any>('/admin/apps/apps/from-template/' + templateId, data),
|
|
|
|
getAIAppCategories: () => get<any>('/admin/apps/categories'),
|
|
|
|
// Logo 上传
|
|
|
|
uploadLogo: (formData: FormData) => {
|
|
|
|
const token = localStorage.getItem('access_token');
|
|
|
|
return fetch(`/app/api/admin/settings/logo/upload`, {
|
|
|
|
method: 'POST',
|
|
|
|
headers: { 'Authorization': `Bearer ${token}` },
|
|
|
|
body: formData,
|
|
|
|
}).then(res => res.json());
|
|
|
|
},
|
|
|
|
|
|
|
|
// MCP Market (Phase G1)
|
|
|
|
getMcpMarketStats: () =>
|
|
|
|
get<any>('/admin/mcp-market/stats'),
|
|
|
|
getMcpTools: (params?: Record<string, any>) =>
|
|
|
|
get<any>('/admin/mcp-market/?' + new URLSearchParams(params || {}).toString()),
|
|
|
|
getMcpToolDetail: (id: string) =>
|
|
|
|
get<any>('/admin/mcp-market/' + id),
|
|
|
|
createMcpTool: (data: any) =>
|
|
|
|
post<any>('/admin/mcp-market/', data),
|
|
|
|
updateMcpTool: (id: string, data: any) =>
|
|
|
|
put<any>('/admin/mcp-market/' + id, data),
|
|
|
|
deleteMcpTool: (id: string) =>
|
|
|
|
del<any>('/admin/mcp-market/' + id),
|
|
|
|
scanMcpTool: (id: string) =>
|
|
|
|
post<any>('/admin/mcp-market/' + id + '/security-scan'),
|
|
|
|
updateMcpToolSecurity: (id: string, data: any) =>
|
|
|
|
put<any>('/admin/mcp-market/' + id + '/security-status', data),
|
|
|
|
regenMcpDeepLink: (id: string) =>
|
|
|
|
post<any>('/admin/mcp-market/' + id + '/deep-link'),
|
|
|
|
getMcpManagedServers: () =>
|
|
|
|
get<any>('/admin/mcp-market/managed/servers'),
|
|
|
|
seedMcpTools: () =>
|
|
|
|
post<any>('/admin/mcp-market/seed'),
|
|
|
|
|
|
|
|
// Code Execution Sandbox (Phase G2)
|
|
|
|
getCodeExecStats: () => get<any>('/admin/code-exec/stats'),
|
|
|
|
getCodeExecRuntimes: () => get<any>('/admin/code-exec/runtimes'),
|
|
|
|
executeCode: (data: { language: string; code: string; stdin?: string; timeout?: number }) =>
|
|
|
|
post<any>('/admin/code-exec/execute', data),
|
|
|
|
getCodeExecTasks: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/code-exec/tasks${sp.toString() ? '?' + sp.toString() : ''}`);
|
|
|
|
},
|
|
|
|
getCodeExecTask: (id: string) => get<any>(`/admin/code-exec/tasks/${id}`),
|
|
|
|
deleteCodeExecTask: (id: string) => del<any>(`/admin/code-exec/tasks/${id}`),
|
|
|
|
|
|
|
|
|
|
|
|
// Distribution Builder (Phase G4)
|
|
|
|
getDistributionStats: () => get<any>('/admin/distributions/stats'),
|
|
|
|
getDistributions: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]: [string, any]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>('/admin/distributions' + (sp.toString() ? '?' + sp.toString() : ''));
|
|
|
|
},
|
|
|
|
getDistributionTemplates: () => get<any>('/admin/distributions/templates'),
|
|
|
|
createDistribution: (data: any) => post<any>('/admin/distributions', data),
|
|
|
|
getDistribution: (id: string) => get<any>('/admin/distributions/' + id),
|
|
|
|
updateDistribution: (id: string, data: any) => put<any>('/admin/distributions/' + id, data),
|
|
|
|
deleteDistribution: (id: string) => del<any>('/admin/distributions/' + id),
|
|
|
|
getDistributionLicenses: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]: [string, any]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>('/admin/distributions/licenses' + (sp.toString() ? '?' + sp.toString() : ''));
|
|
|
|
},
|
|
|
|
createDistributionLicense: (distroId: string, data: any) => post<any>('/admin/distributions/' + distroId + '/licenses', data),
|
|
|
|
getDistributionLicense: (id: string) => get<any>('/admin/distributions/licenses/' + id),
|
|
|
|
revokeDistributionLicense: (id: string) => post<any>('/admin/distributions/licenses/' + id + '/revoke'),
|
|
|
|
// ===== Ads Management =====
|
|
|
|
getAds: () => get<any>('/admin/ads/'),
|
|
|
|
addAd: (data: any) => post<any>('/admin/ads/', data),
|
|
|
|
updateAd: (id: string, data: any) => put<any>(`/admin/ads/${id}`, data),
|
|
|
|
deleteAd: (id: string) => del<any>(`/admin/ads/${id}`),
|
|
|
|
|
|
|
|
// ===== Market Admin (extended) =====
|
|
|
|
getMarketOverview: () => get<any>('/admin/market/overview'),
|
|
|
|
getTopApps: (metric?: string, limit?: number) => get<any>(`/admin/market/top-apps${metric ? '?metric=' + metric : ''}${limit ? (metric ? '&' : '?') + 'limit=' + limit : ''}`),
|
|
|
|
getAdminMarketApps: (params?: string) => get<any>(`/admin/market/apps${params ? '?' + params : ''}`),
|
|
|
|
getPendingApps: () => get<any>('/admin/market/pending'),
|
|
|
|
getCoupons: () => get<any>('/admin/market/coupons'),
|
|
|
|
getRecentReviews: () => get<any>('/admin/market/reviews'),
|
|
|
|
approveApp: (id: string) => post<any>(`/admin/market/apps/${id}/approve`),
|
|
|
|
rejectApp: (id: string) => post<any>(`/admin/market/apps/${id}/reject`),
|
|
|
|
setFeaturedApp: (id: string, featured: boolean, sortOrder?: number) => put<any>(`/admin/market/apps/${id}/featured`, { featured, sort_order: sortOrder }),
|
|
|
|
deleteMarketApp: (id: string) => del<any>(`/admin/market/apps/${id}`),
|
|
|
|
deleteCoupon: (id: string) => del<any>(`/admin/market/coupons/${id}`),
|
|
|
|
updateMarketApp: (id: string, data: any) => put<any>(`/admin/market/apps/${id}`, data),
|
|
|
|
updateCoupon: (id: string, data: any) => put<any>(`/admin/market/coupons/${id}`, data),
|
|
|
|
addCoupon: (data: any) => post<any>('/admin/market/coupons', data),
|
|
|
|
|
|
|
|
// ===== Membership (extended) =====
|
|
|
|
getMembershipStats: () => get<any>('/admin/membership/stats'),
|
|
|
|
revokeMembership: (userId: string) => post<any>(`/admin/membership/users/${userId}/revoke`),
|
|
|
|
|
|
|
|
// ===== Logs (extended) =====
|
|
|
|
getOperationLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any[]>(`/admin/logs/operation-logs${sp.toString() ? '?' + sp.toString() : ''}`);
|
|
|
|
},
|
|
|
|
getTokenLogs: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any[]>(`/admin/logs/token-logs${sp.toString() ? '?' + sp.toString() : ''}`);
|
|
|
|
},
|
|
|
|
|
|
|
|
// ===== Analytics =====
|
|
|
|
getAnalyticsOverview: (days?: number) => get<any>(`/admin/analytics/overview${days ? '?days=' + days : ''}`),
|
|
|
|
getAnalyticsApiTrends: (days?: number) => get<any>(`/admin/analytics/trends/api-calls${days ? '?days=' + days : ''}`),
|
|
|
|
getAnalyticsTokenTrends: (days?: number) => get<any>(`/admin/analytics/trends/tokens${days ? '?days=' + days : ''}`),
|
|
|
|
getAnalyticsUserTrends: (days?: number) => get<any>(`/admin/analytics/trends/users${days ? '?days=' + days : ''}`),
|
|
|
|
getAnalyticsRevenueTrends: (days?: number) => get<any>(`/admin/analytics/trends/revenue${days ? '?days=' + days : ''}`),
|
|
|
|
getAnalyticsModelUsage: (days?: number) => get<any>(`/admin/analytics/models/usage${days ? '?days=' + days : ''}`),
|
|
|
|
|
|
|
|
// ===== Billing =====
|
|
|
|
getBillingRules: () => get<any>('/admin/billing/rules'),
|
|
|
|
getBillingPackages: () => get<any>('/admin/billing/packages'),
|
|
|
|
getBillingTransactions: (page?: number) => get<any>(`/admin/billing/transactions${page ? '?page=' + page : ''}`),
|
|
|
|
getBillingStats: () => get<any>('/admin/billing/stats/overview'),
|
|
|
|
|
|
|
|
// ===== Tenant =====
|
|
|
|
getTenants: (page?: number) => get<any>(`/admin/tenant/list${page ? '?page=' + page : ''}`),
|
|
|
|
getTenantStats: () => get<any>('/admin/tenant/stats/overview'),
|
|
|
|
getTenantMembers: (tenantId: string) => get<any>(`/admin/tenant/${tenantId}/members`),
|
|
|
|
createTenant: (params: string) => post<any>(`/admin/tenant/create${params}`),
|
|
|
|
|
|
|
|
};
|
|
|
|
// ===== AI自进化API =====
|
|
|
|
export const evolutionAPI = {
|
|
|
|
// 驾驶舱面板
|
|
|
|
getSkillTree: () => get<import('@/types').SkillTreeData>('/evolution/dashboard/skill-tree'),
|
|
|
|
getTimeline: (eventType?: string) =>
|
|
|
|
get<import('@/types').EvolutionEvent[]>('/evolution/dashboard/timeline' + (eventType ? `?event_type=${eventType}` : '')),
|
|
|
|
getStatistics: () => get<import('@/types').StatisticsData>('/evolution/dashboard/statistics'),
|
|
|
|
getProfile: () => get<import('@/types').EvolutionProfile>('/evolution/dashboard/profile'),
|
|
|
|
|
|
|
|
// 技能管理
|
|
|
|
getSkills: (params?: { state?: string; keyword?: string; sort_by?: string; order?: string }) => {
|
|
|
|
const query = new URLSearchParams();
|
|
|
|
if (params?.state) query.append('state', params.state);
|
|
|
|
if (params?.keyword) query.append('keyword', params.keyword);
|
|
|
|
if (params?.sort_by) query.append('sort_by', params.sort_by);
|
|
|
|
if (params?.order) query.append('order', params.order);
|
|
|
|
const qs = query.toString();
|
|
|
|
return get<import('@/types').EvolutionSkill[]>('/evolution/skills' + (qs ? `?${qs}` : ''));
|
|
|
|
},
|
|
|
|
getSkillDetail: (name: string) => get<import('@/types').EvolutionSkill>(`/evolution/skills/${encodeURIComponent(name)}`),
|
|
|
|
updateSkill: (name: string, data: { description?: string; tags?: string[]; category?: string }) =>
|
|
|
|
put<import('@/types').EvolutionSkill>(`/evolution/skills/${encodeURIComponent(name)}`, data),
|
|
|
|
deleteSkill: (name: string) => del(`/evolution/skills/${encodeURIComponent(name)}`),
|
|
|
|
freezeSkill: (name: string) => post(`/evolution/skills/${encodeURIComponent(name)}/freeze`),
|
|
|
|
unfreezeSkill: (name: string) => post(`/evolution/skills/${encodeURIComponent(name)}/unfreeze`),
|
|
|
|
getSkillHistory: (name: string) => get<import('@/types').EvolutionEvent[]>(`/evolution/skills/${encodeURIComponent(name)}/history`),
|
|
|
|
getSkillTrajectories: (name: string) => get<import('@/types').EvolutionTrajectory[]>(`/evolution/skills/${encodeURIComponent(name)}/trajectories`),
|
|
|
|
|
|
|
|
// 事件
|
|
|
|
getEvents: (params?: { event_type?: string; skill_name?: string; limit?: number }) => {
|
|
|
|
const query = new URLSearchParams();
|
|
|
|
if (params?.event_type) query.append('event_type', params.event_type);
|
|
|
|
if (params?.skill_name) query.append('skill_name', params.skill_name);
|
|
|
|
if (params?.limit) query.append('limit', String(params.limit));
|
|
|
|
const qs = query.toString();
|
|
|
|
return get<import('@/types').EvolutionEvent[]>('/evolution/events' + (qs ? `?${qs}` : ''));
|
|
|
|
},
|
|
|
|
|
|
|
|
// 轨迹提交
|
|
|
|
submitTrajectory: (data: { conversation_id: string; messages: any[] }) =>
|
|
|
|
post('/evolution/trajectory/submit', data),
|
|
|
|
|
|
|
|
// v2: 技能回滚
|
|
|
|
rollbackSkill: (skillName: string, version: number) =>
|
|
|
|
post<import('@/types').EvolutionSkill>(`/evolution/skills/${encodeURIComponent(skillName)}/rollback/${version}`),
|
|
|
|
|
|
|
|
// v2: 发布到市场
|
|
|
|
publishSkill: (skillName: string, data: { price: number; market_description: string }) =>
|
|
|
|
post(`/evolution/skills/${encodeURIComponent(skillName)}/publish`, data),
|
|
|
|
|
|
|
|
// v2: 团队共享
|
|
|
|
shareToTeam: (skillName: string, teamId: string) =>
|
|
|
|
post(`/evolution/skills/${encodeURIComponent(skillName)}/share-to-team`, { team_id: teamId }),
|
|
|
|
|
|
|
|
// v2: 流水线状态
|
|
|
|
getPipelineStatus: () => get<import('@/types').PipelineStatus>('/evolution/pipeline/status'),
|
|
|
|
|
|
|
|
// v2: 手动触发流水线
|
|
|
|
triggerPipeline: () => post('/evolution/pipeline/trigger'),
|
|
|
|
|
|
|
|
// v2: Watcher状态
|
|
|
|
getWatcherStatus: () => get<import('@/types').WatcherStatus>('/evolution/watcher/status'),
|
|
|
|
|
|
|
|
// v2: 进化报告
|
|
|
|
getReports: (reportType?: string) => {
|
|
|
|
const qs = reportType ? `?report_type=${reportType}` : '';
|
|
|
|
return get<import('@/types').EvolutionReport[]>(`/evolution/reports${qs}`);
|
|
|
|
},
|
|
|
|
getReportDetail: (reportId: string) => get<import('@/types').EvolutionReport>(`/evolution/reports/${reportId}`),
|
|
|
|
|
|
|
|
|
|
|
|
// Workflow (Phase 3.6)
|
|
|
|
getWorkflows: (params?: Record<string, any>) =>
|
|
|
|
get<any>('/admin/workflows/?' + new URLSearchParams(params || {}).toString()),
|
|
|
|
getWorkflow: (id: string) =>
|
|
|
|
get<any>(`/admin/workflows/${id}`),
|
|
|
|
getWorkflowStats: () =>
|
|
|
|
get<any>('/admin/workflows/stats'),
|
|
|
|
getWorkflowTemplates: () =>
|
|
|
|
get<any>('/admin/workflows/templates'),
|
|
|
|
createWorkflow: (data: any) =>
|
|
|
|
post<any>('/admin/workflows/', data),
|
|
|
|
updateWorkflow: (id: string, data: any) =>
|
|
|
|
put<any>(`/admin/workflows/${id}`, data),
|
|
|
|
deleteWorkflow: (id: string) =>
|
|
|
|
del<any>(`/admin/workflows/${id}`),
|
|
|
|
toggleWorkflow: (id: string, isActive: boolean) =>
|
|
|
|
post<any>(`/admin/workflows/${id}/toggle?is_active=${isActive}`),
|
|
|
|
executeWorkflow: (id: string, inputText: string) =>
|
|
|
|
post<any>(`/admin/workflows/${id}/execute`, { input_text: inputText }),
|
|
|
|
|
|
|
|
|
|
|
|
// Privacy & Local Agent (Phase G5)
|
|
|
|
getPrivacyStats: () => get<any>('/admin/privacy/stats'),
|
|
|
|
getPrivacyConfig: () => get<any>('/admin/privacy/config'),
|
|
|
|
updatePrivacyConfig: (params: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
Object.entries(params).forEach(([k, v]) => { if (v != null) sp.append(k, String(v)); });
|
|
|
|
return put<any>('/admin/privacy/config?' + sp.toString());
|
|
|
|
},
|
|
|
|
switchPrivacyMode: (mode: string) => post<any>('/admin/privacy/switch-mode?mode=' + encodeURIComponent(mode)),
|
|
|
|
getPrivacyLicenses: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params?.status) sp.append('status', params.status);
|
|
|
|
return get<any>('/admin/privacy/licenses' + (sp.toString() ? '?' + sp.toString() : ''));
|
|
|
|
},
|
|
|
|
generateOfflineLicense: (data: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (data.agent_id) sp.append('agent_id', data.agent_id);
|
|
|
|
sp.append('max_offline_days', String(data.max_offline_days || 7));
|
|
|
|
return post<any>('/admin/privacy/licenses/generate?' + sp.toString());
|
|
|
|
},
|
|
|
|
revokePrivacyLicense: (id: number) => post<any>('/admin/privacy/licenses/' + id + '/revoke'),
|
|
|
|
validatePrivacyLicense: (licenseKey: string) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
sp.append('license_key', licenseKey);
|
|
|
|
return post<any>('/admin/privacy/licenses/validate?' + sp.toString());
|
|
|
|
},
|
|
|
|
getKbSyncStates: () => get<any>('/admin/privacy/kb-sync'),
|
|
|
|
triggerKbSync: (kbId: number, direction: string) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
sp.append('knowledge_base_id', String(kbId));
|
|
|
|
sp.append('sync_direction', direction);
|
|
|
|
return post<any>('/admin/privacy/kb-sync/trigger?' + sp.toString());
|
|
|
|
},
|
|
|
|
getLocalAgents: () => get<any>('/admin/privacy/local-agents'),
|
|
|
|
getPrivacyUsageStats: () => get<any>('/admin/privacy/usage/stats'),
|
|
|
|
getBridgeConfig: () => get<any>('/admin/privacy/bridge-config'),
|
|
|
|
|
|
|
|
// IM Bot Management (Phase 4)
|
|
|
|
getImBotStats: () => get('/admin/im-bot/stats'),
|
|
|
|
getImBotDashboard: () => get('/admin/im-bot/dashboard'),
|
|
|
|
getImBotChannels: (params?: string) => get(`/admin/im-bot/channels${params || ''}`),
|
|
|
|
getImBotChannelDetail: (id: string) => get(`/admin/im-bot/channels/${id}`),
|
|
|
|
testImBotChannel: (id: string) => post(`/admin/im-bot/channels/${id}/test`),
|
|
|
|
activateImBotChannel: (id: string) => post(`/admin/im-bot/channels/${id}/activate`),
|
|
|
|
deactivateImBotChannel: (id: string) => post(`/admin/im-bot/channels/${id}/deactivate`),
|
|
|
|
getImBotRoutes: (params?: string) => get(`/admin/im-bot/routes${params || ''}`),
|
|
|
|
createImBotRoute: (params: string) => post(`/admin/im-bot/routes${params}`),
|
|
|
|
deleteImBotRoute: (id: string) => del(`/admin/im-bot/routes/${id}`),
|
|
|
|
// 个人微信(iLink 协议)原生适配器
|
|
|
|
getWechatConfig: () => get('/admin/im-bot/wechat'),
|
|
|
|
wechatQrcode: () => post('/admin/im-bot/wechat/qrcode'),
|
|
|
|
wechatQrcodeStatus: (params: string) => post(`/admin/im-bot/wechat/qrcode/status${params}`),
|
|
|
|
getWechatStatus: () => get('/admin/im-bot/wechat/status'),
|
|
|
|
disconnectWechat: () => post('/admin/im-bot/wechat/disconnect'),
|
|
|
|
getImBotPlatforms: () => get('/admin/im-bot/platforms'),
|
|
|
|
getImBotWebhookUrl: (platform: string) => get(`/admin/im-bot/webhook-url/${platform}`),
|
|
|
|
getImBotMessages: (params?: string) => get(`/admin/im-bot/messages${params || ''}`),
|
|
|
|
imBotQuickSetup: (params: string) => post(`/admin/im-bot/quick-setup${params}`),
|
|
|
|
|
|
|
|
// 推广系统
|
|
|
|
getPromotionStats: () => get<any>('/admin/promotion/stats'),
|
|
|
|
getPromotions: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v !== undefined && v !== null && v !== '') sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/promotion/promotions${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
createPromotion: (params: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
Object.entries(params).forEach(([k, v]) => { if (v !== undefined && v !== null && v !== '') sp.set(k, String(v)); });
|
|
|
|
return post<any>(`/admin/promotion/promotions${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
updatePromotion: (id: string, params: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
Object.entries(params).forEach(([k, v]) => { if (v !== undefined && v !== null && v !== '') sp.set(k, String(v)); });
|
|
|
|
return put<any>(`/admin/promotion/promotions/${id}${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
deletePromotion: (id: string) => del<any>(`/admin/promotion/promotions/${id}`),
|
|
|
|
togglePromotion: (id: string) => post<any>(`/admin/promotion/promotions/${id}/toggle`),
|
|
|
|
getReferralLinks: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/promotion/referral-links${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
generateReferralLink: (params: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return post<any>(`/admin/promotion/referral-links/generate${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
getReferralRewards: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/promotion/rewards${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
approveReward: (id: string) => post<any>(`/admin/promotion/rewards/${id}/approve`),
|
|
|
|
markRewardPaid: (id: string, params: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return post<any>(`/admin/promotion/rewards/${id}/pay${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
getPromotionLeaderboard: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/promotion/leaderboard${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
regenerateReferralCode: (id: string) => post<any>(`/admin/promotion/referral-links/${id}/regenerate`),
|
|
|
|
getMyReferrals: () => get<any>('/admin/promotion/my-referrals'),
|
|
|
|
getMyRewards: () => get<any>('/admin/promotion/my-rewards'),
|
|
|
|
|
|
|
|
// 成就系统
|
|
|
|
getAchievements: (params?: string) => get<any>(`/admin/achievement/achievements${params || ''}`),
|
|
|
|
getAchievementDetail: (id: string) => get<any>(`/admin/achievement/achievements/${id}`),
|
|
|
|
createAchievement: (params: string) => post<any>(`/admin/achievement/achievements${params}`),
|
|
|
|
updateAchievement: (id: string, params: string) => put<any>(`/admin/achievement/achievements/${id}${params}`),
|
|
|
|
deleteAchievement: (id: string) => del<any>(`/admin/achievement/achievements/${id}`),
|
|
|
|
getUserAchievements: () => get<any>('/admin/achievement/user/achievements'),
|
|
|
|
claimAchievementReward: (id: string) => post<any>(`/admin/achievement/user/achievements/${id}/claim`),
|
|
|
|
checkAchievementProgress: () => post<any>('/admin/achievement/check-progress'),
|
|
|
|
getAchievementLeaderboard: (params?: string) => get<any>(`/admin/achievement/leaderboard${params || ''}`),
|
|
|
|
|
|
|
|
// 多租户管理
|
|
|
|
getTenants: (page?: number, keyword?: string, status?: string) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (page) sp.set('page', String(page));
|
|
|
|
if (keyword) sp.set('keyword', keyword);
|
|
|
|
if (status) sp.set('status', status);
|
|
|
|
sp.set('page_size', '20');
|
|
|
|
return get<any>(`/admin/tenant/list${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
createTenant: (params: string) => post<any>(`/admin/tenant/create${params}`),
|
|
|
|
getTenantDetail: (id: string) => get<any>(`/admin/tenant/${id}`),
|
|
|
|
updateTenant: (id: string, params: string) => put<any>(`/admin/tenant/${id}${params}`),
|
|
|
|
deleteTenant: (id: string) => del<any>(`/admin/tenant/${id}`),
|
|
|
|
getTenantMembers: (tenantId: string, page?: number) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
sp.set('page', String(page || 1));
|
|
|
|
sp.set('page_size', '100');
|
|
|
|
return get<any>(`/admin/tenant/${tenantId}/members?${sp.toString()}`);
|
|
|
|
},
|
|
|
|
addTenantMember: (tenantId: string, params: string) => post<any>(`/admin/tenant/${tenantId}/members/add${params}`),
|
|
|
|
updateTenantMember: (tenantId: string, memberId: string, params: string) => put<any>(`/admin/tenant/${tenantId}/members/${memberId}${params}`),
|
|
|
|
removeTenantMember: (tenantId: string, memberId: string) => del<any>(`/admin/tenant/${tenantId}/members/${memberId}`),
|
|
|
|
getTenantQuotas: (tenantId: string) => get<any>(`/admin/tenant/${tenantId}/quotas`),
|
|
|
|
updateTenantQuota: (tenantId: string, params: string) => put<any>(`/admin/tenant/${tenantId}/quotas${params}`),
|
|
|
|
getTenantInvitations: (tenantId: string) => get<any>(`/admin/tenant/${tenantId}/invitations`),
|
|
|
|
createTenantInvitation: (tenantId: string, params: string) => post<any>(`/admin/tenant/${tenantId}/invitations${params}`),
|
|
|
|
getTenantStats: () => get<any>('/admin/tenant/stats/overview'),
|
|
|
|
|
|
|
|
// 计费与支付
|
|
|
|
getBillingRules: (page?: number) => get<any>(`/admin/billing/rules?page=${page || 1}&page_size=100`),
|
|
|
|
createBillingRule: (params: string) => post<any>(`/admin/billing/rules/create${params}`),
|
|
|
|
updateBillingRule: (id: string, params: string) => put<any>(`/admin/billing/rules/${id}${params}`),
|
|
|
|
deleteBillingRule: (id: string) => del<any>(`/admin/billing/rules/${id}`),
|
|
|
|
getBillingPackages: () => get<any>('/admin/billing/packages'),
|
|
|
|
createBillingPackage: (params: string) => post<any>(`/admin/billing/packages/create${params}`),
|
|
|
|
updateBillingPackage: (id: string, params: string) => put<any>(`/admin/billing/packages/${id}${params}`),
|
|
|
|
deleteBillingPackage: (id: string) => del<any>(`/admin/billing/packages/${id}`),
|
|
|
|
getBillingTransactions: (page?: number) => get<any>(`/admin/billing/transactions?page=${page || 1}&page_size=20`),
|
|
|
|
getInvoices: (page?: number) => get<any>(`/admin/billing/invoices?page=${page || 1}&page_size=20`),
|
|
|
|
generateInvoice: (params: string) => post<any>(`/admin/billing/invoices/generate${params}`),
|
|
|
|
getPaymentConfigs: () => get<any>('/admin/billing/payment-configs'),
|
|
|
|
updatePaymentConfig: (id: string, params: string) => put<any>(`/admin/billing/payment-configs/${id}${params}`),
|
|
|
|
getBillingStats: () => get<any>('/admin/billing/stats/overview'),
|
|
|
|
|
|
|
|
// 数据分析
|
|
|
|
getAnalyticsOverview: (days?: number) => get<any>(`/admin/analytics/overview?days=${days || 30}`),
|
|
|
|
getAnalyticsApiTrends: (days?: number) => get<any>(`/admin/analytics/trends/api-calls?days=${days || 7}`),
|
|
|
|
getAnalyticsTokenTrends: (days?: number) => get<any>(`/admin/analytics/trends/tokens?days=${days || 7}`),
|
|
|
|
getAnalyticsUserTrends: (days?: number) => get<any>(`/admin/analytics/trends/users?days=${days || 30}`),
|
|
|
|
getAnalyticsRevenueTrends: (days?: number) => get<any>(`/admin/analytics/trends/revenue?days=${days || 30}`),
|
|
|
|
getAnalyticsModelUsage: (days?: number) => get<any>(`/admin/analytics/models/usage?days=${days || 30}`),
|
|
|
|
getAnalyticsDashboards: () => get<any>('/admin/analytics/dashboards'),
|
|
|
|
createAnalyticsDashboard: (params: string) => post<any>(`/admin/analytics/dashboards/create${params}`),
|
|
|
|
deleteAnalyticsDashboard: (id: string) => del<any>(`/admin/analytics/dashboards/${id}`),
|
|
|
|
getAnalyticsEvents: (params?: any) => {
|
|
|
|
const sp = new URLSearchParams();
|
|
|
|
if (params) Object.entries(params).forEach(([k, v]) => { if (v) sp.set(k, String(v)); });
|
|
|
|
return get<any>(`/admin/analytics/events${sp.toString() ? `?${sp.toString()}` : ''}`);
|
|
|
|
},
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// ===== 前台用户个人微信 (iLink 协议 / 微信 ClawBot 插件) =====
|
|
|
|
export const imUserAPI = {
|
|
|
|
getStatus: () => get<any>('/im/wechat/status'),
|
|
|
|
qrcode: () => post<any>('/im/wechat/qrcode'),
|
|
|
|
qrcodeStatus: (qrcode: string) => post<any>(`/im/wechat/qrcode/status?qrcode=${encodeURIComponent(qrcode)}`),
|
|
|
|
disconnect: () => post<any>('/im/wechat/disconnect'),
|
|
|
|
history: () => get<any>('/im/wechat/history'),
|
|
|
|
};
|
|
|