import type { SystemStatus, AccountInfo, Position, DecisionRecord, Statistics, TraderInfo, AIModel, Exchange, CreateTraderRequest, UpdateModelConfigRequest, UpdateExchangeConfigRequest, CompetitionData, } from '../types'; import { CryptoService } from './crypto'; const API_BASE = '/api' // Helper function to get auth headers function getAuthHeaders(): Record { const token = localStorage.getItem('auth_token') const headers: Record = { 'Content-Type': 'application/json', } if (token) { headers['Authorization'] = `Bearer ${token}` } return headers } export const api = { // AI交易员管理接口 async getTraders(): Promise { const res = await fetch(`${API_BASE}/my-traders`, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取trader列表失败') return res.json() }, // 获取公开的交易员列表(无需认证) async getPublicTraders(): Promise { const res = await fetch(`${API_BASE}/traders`) if (!res.ok) throw new Error('获取公开trader列表失败') return res.json() }, async createTrader(request: CreateTraderRequest): Promise { const res = await fetch(`${API_BASE}/traders`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(request), }) if (!res.ok) throw new Error('创建交易员失败') return res.json() }, async deleteTrader(traderId: string): Promise { const res = await fetch(`${API_BASE}/traders/${traderId}`, { method: 'DELETE', headers: getAuthHeaders(), }) if (!res.ok) throw new Error('删除交易员失败') }, async startTrader(traderId: string): Promise { const res = await fetch(`${API_BASE}/traders/${traderId}/start`, { method: 'POST', headers: getAuthHeaders(), }) if (!res.ok) throw new Error('启动交易员失败') }, async stopTrader(traderId: string): Promise { const res = await fetch(`${API_BASE}/traders/${traderId}/stop`, { method: 'POST', headers: getAuthHeaders(), }) if (!res.ok) throw new Error('停止交易员失败') }, async updateTraderPrompt( traderId: string, customPrompt: string ): Promise { const res = await fetch(`${API_BASE}/traders/${traderId}/prompt`, { method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify({ custom_prompt: customPrompt }), }) if (!res.ok) throw new Error('更新自定义策略失败') }, async getTraderConfig(traderId: string): Promise { const res = await fetch(`${API_BASE}/traders/${traderId}/config`, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取交易员配置失败') return res.json() }, async updateTrader( traderId: string, request: CreateTraderRequest ): Promise { const res = await fetch(`${API_BASE}/traders/${traderId}`, { method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify(request), }) if (!res.ok) throw new Error('更新交易员失败') return res.json() }, // AI模型配置接口 async getModelConfigs(): Promise { const res = await fetch(`${API_BASE}/models`, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取模型配置失败') return res.json() }, // 获取系统支持的AI模型列表(无需认证) async getSupportedModels(): Promise { const res = await fetch(`${API_BASE}/supported-models`) if (!res.ok) throw new Error('获取支持的模型失败') return res.json() }, async updateModelConfigs(request: UpdateModelConfigRequest): Promise { const res = await fetch(`${API_BASE}/models`, { method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify(request), }) if (!res.ok) throw new Error('更新模型配置失败') }, // 交易所配置接口 async getExchangeConfigs(): Promise { const res = await fetch(`${API_BASE}/exchanges`, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取交易所配置失败') return res.json() }, // 获取系统支持的交易所列表(无需认证) async getSupportedExchanges(): Promise { const res = await fetch(`${API_BASE}/supported-exchanges`) if (!res.ok) throw new Error('获取支持的交易所失败') return res.json() }, async updateExchangeConfigs( request: UpdateExchangeConfigRequest ): Promise { const res = await fetch(`${API_BASE}/exchanges`, { method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify(request), }) if (!res.ok) throw new Error('更新交易所配置失败') }, // 使用加密传输更新交易所配置 async updateExchangeConfigsEncrypted(request: UpdateExchangeConfigRequest): Promise { // 从系统配置获取公钥 const configRes = await fetch(`${API_BASE}/config`); if (!configRes.ok) throw new Error('获取系统配置失败'); const config = await configRes.json(); if (!config.rsa_public_key) { throw new Error('系统未配置RSA公钥,无法使用加密传输'); } // 初始化加密服务 await CryptoService.initialize(config.rsa_public_key); // 获取用户信息(从localStorage或其他地方) const userId = localStorage.getItem('user_id') || ''; const sessionId = sessionStorage.getItem('session_id') || ''; // 加密敏感数据 const encryptedPayload = await CryptoService.encryptSensitiveData( JSON.stringify(request), userId, sessionId ); // 发送加密数据 const res = await fetch(`${API_BASE}/exchanges/encrypted`, { method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify(encryptedPayload), }); if (!res.ok) throw new Error('更新交易所配置失败'); }, // 获取系统状态(支持trader_id) async getStatus(traderId?: string): Promise { const url = traderId ? `${API_BASE}/status?trader_id=${traderId}` : `${API_BASE}/status` const res = await fetch(url, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取系统状态失败') return res.json() }, // 获取账户信息(支持trader_id) async getAccount(traderId?: string): Promise { const url = traderId ? `${API_BASE}/account?trader_id=${traderId}` : `${API_BASE}/account` const res = await fetch(url, { cache: 'no-store', headers: { ...getAuthHeaders(), 'Cache-Control': 'no-cache', }, }) if (!res.ok) throw new Error('获取账户信息失败') const data = await res.json() console.log('Account data fetched:', data) return data }, // 获取持仓列表(支持trader_id) async getPositions(traderId?: string): Promise { const url = traderId ? `${API_BASE}/positions?trader_id=${traderId}` : `${API_BASE}/positions` const res = await fetch(url, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取持仓列表失败') return res.json() }, // 获取决策日志(支持trader_id) async getDecisions(traderId?: string): Promise { const url = traderId ? `${API_BASE}/decisions?trader_id=${traderId}` : `${API_BASE}/decisions` const res = await fetch(url, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取决策日志失败') return res.json() }, // 获取最新决策(支持trader_id) async getLatestDecisions(traderId?: string): Promise { const url = traderId ? `${API_BASE}/decisions/latest?trader_id=${traderId}` : `${API_BASE}/decisions/latest` const res = await fetch(url, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取最新决策失败') return res.json() }, // 获取统计信息(支持trader_id) async getStatistics(traderId?: string): Promise { const url = traderId ? `${API_BASE}/statistics?trader_id=${traderId}` : `${API_BASE}/statistics` const res = await fetch(url, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取统计信息失败') return res.json() }, // 获取收益率历史数据(支持trader_id) async getEquityHistory(traderId?: string): Promise { const url = traderId ? `${API_BASE}/equity-history?trader_id=${traderId}` : `${API_BASE}/equity-history` const res = await fetch(url, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取历史数据失败') return res.json() }, // 批量获取多个交易员的历史数据(无需认证) async getEquityHistoryBatch(traderIds: string[]): Promise { const res = await fetch(`${API_BASE}/equity-history-batch`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ trader_ids: traderIds }), }) if (!res.ok) throw new Error('获取批量历史数据失败') return res.json() }, // 获取前5名交易员数据(无需认证) async getTopTraders(): Promise { const res = await fetch(`${API_BASE}/top-traders`) if (!res.ok) throw new Error('获取前5名交易员失败') return res.json() }, // 获取公开交易员配置(无需认证) async getPublicTraderConfig(traderId: string): Promise { const res = await fetch(`${API_BASE}/trader/${traderId}/config`) if (!res.ok) throw new Error('获取公开交易员配置失败') return res.json() }, // 获取AI学习表现分析(支持trader_id) async getPerformance(traderId?: string): Promise { const url = traderId ? `${API_BASE}/performance?trader_id=${traderId}` : `${API_BASE}/performance` const res = await fetch(url, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取AI学习数据失败') return res.json() }, // 获取竞赛数据(无需认证) async getCompetition(): Promise { const res = await fetch(`${API_BASE}/competition`) if (!res.ok) throw new Error('获取竞赛数据失败') return res.json() }, // 用户信号源配置接口 async getUserSignalSource(): Promise<{ coin_pool_url: string oi_top_url: string }> { const res = await fetch(`${API_BASE}/user/signal-sources`, { headers: getAuthHeaders(), }) if (!res.ok) throw new Error('获取用户信号源配置失败') return res.json() }, async saveUserSignalSource( coinPoolUrl: string, oiTopUrl: string ): Promise { const res = await fetch(`${API_BASE}/user/signal-sources`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify({ coin_pool_url: coinPoolUrl, oi_top_url: oiTopUrl, }), }) if (!res.ok) throw new Error('保存用户信号源配置失败') }, // 获取服务器IP(需要认证,用于白名单配置) async getServerIP(): Promise<{ public_ip: string; message: string; }> { const res = await fetch(`${API_BASE}/server-ip`, { headers: getAuthHeaders(), }); if (!res.ok) throw new Error('获取服务器IP失败'); return res.json(); }, };