|
|
|
|
|
|
|
|
import axios, { AxiosInstance } from 'axios'; |
|
|
import type { |
|
|
Model, |
|
|
AuthStatus, |
|
|
CodeGenerationRequest, |
|
|
DeploymentRequest, |
|
|
DeploymentResponse, |
|
|
Language, |
|
|
} from '@/types'; |
|
|
|
|
|
|
|
|
|
|
|
const API_URL = process.env.NEXT_PUBLIC_API_URL || |
|
|
(typeof window !== 'undefined' && window.location.hostname !== 'localhost' |
|
|
? '' |
|
|
: 'http://localhost:8000'); |
|
|
|
|
|
class ApiClient { |
|
|
private client: AxiosInstance; |
|
|
private token: string | null = null; |
|
|
|
|
|
constructor() { |
|
|
this.client = axios.create({ |
|
|
baseURL: API_URL, |
|
|
headers: { |
|
|
'Content-Type': 'application/json', |
|
|
}, |
|
|
}); |
|
|
|
|
|
|
|
|
this.client.interceptors.request.use((config) => { |
|
|
if (this.token) { |
|
|
config.headers.Authorization = `Bearer ${this.token}`; |
|
|
} |
|
|
return config; |
|
|
}); |
|
|
|
|
|
|
|
|
if (typeof window !== 'undefined') { |
|
|
this.token = localStorage.getItem('hf_oauth_token'); |
|
|
} |
|
|
} |
|
|
|
|
|
setToken(token: string | null) { |
|
|
this.token = token; |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
getToken(): string | null { |
|
|
return this.token; |
|
|
} |
|
|
|
|
|
async getModels(): Promise<Model[]> { |
|
|
const response = await this.client.get<Model[]>('/api/models'); |
|
|
return response.data; |
|
|
} |
|
|
|
|
|
async getLanguages(): Promise<{ languages: Language[] }> { |
|
|
const response = await this.client.get<{ languages: Language[] }>('/api/languages'); |
|
|
return response.data; |
|
|
} |
|
|
|
|
|
async getAuthStatus(): Promise<AuthStatus> { |
|
|
try { |
|
|
const response = await this.client.get<AuthStatus>('/api/auth/status'); |
|
|
return response.data; |
|
|
} catch (error) { |
|
|
return { |
|
|
authenticated: false, |
|
|
message: 'Not authenticated', |
|
|
}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
generateCodeStream( |
|
|
request: CodeGenerationRequest, |
|
|
onChunk: (content: string) => void, |
|
|
onComplete: (code: string) => void, |
|
|
onError: (error: string) => void |
|
|
): () => void { |
|
|
const url = new URL('/api/generate', API_URL); |
|
|
const eventSource = new EventSource( |
|
|
url.toString() + '?' + new URLSearchParams({ |
|
|
query: request.query, |
|
|
language: request.language, |
|
|
model_id: request.model_id, |
|
|
provider: request.provider, |
|
|
}) |
|
|
); |
|
|
|
|
|
eventSource.onmessage = (event) => { |
|
|
try { |
|
|
const data = JSON.parse(event.data); |
|
|
|
|
|
if (data.type === 'chunk' && data.content) { |
|
|
onChunk(data.content); |
|
|
} else if (data.type === 'complete' && data.code) { |
|
|
onComplete(data.code); |
|
|
eventSource.close(); |
|
|
} else if (data.type === 'error') { |
|
|
onError(data.message || 'Unknown error occurred'); |
|
|
eventSource.close(); |
|
|
} |
|
|
} catch (error) { |
|
|
console.error('Error parsing SSE data:', error); |
|
|
} |
|
|
}; |
|
|
|
|
|
eventSource.onerror = (error) => { |
|
|
console.error('EventSource error:', error); |
|
|
onError('Connection error occurred'); |
|
|
eventSource.close(); |
|
|
}; |
|
|
|
|
|
|
|
|
return () => { |
|
|
eventSource.close(); |
|
|
}; |
|
|
} |
|
|
|
|
|
|
|
|
generateCodeWebSocket( |
|
|
request: CodeGenerationRequest, |
|
|
onChunk: (content: string) => void, |
|
|
onComplete: (code: string) => void, |
|
|
onError: (error: string) => void |
|
|
): WebSocket { |
|
|
const wsUrl = API_URL.replace('http', 'ws') + '/ws/generate'; |
|
|
const ws = new WebSocket(wsUrl); |
|
|
|
|
|
ws.onopen = () => { |
|
|
ws.send(JSON.stringify(request)); |
|
|
}; |
|
|
|
|
|
ws.onmessage = (event) => { |
|
|
try { |
|
|
const data = JSON.parse(event.data); |
|
|
|
|
|
if (data.type === 'chunk' && data.content) { |
|
|
onChunk(data.content); |
|
|
} else if (data.type === 'complete' && data.code) { |
|
|
onComplete(data.code); |
|
|
ws.close(); |
|
|
} else if (data.type === 'error') { |
|
|
onError(data.message || 'Unknown error occurred'); |
|
|
ws.close(); |
|
|
} |
|
|
} catch (error) { |
|
|
console.error('Error parsing WebSocket data:', error); |
|
|
} |
|
|
}; |
|
|
|
|
|
ws.onerror = (error) => { |
|
|
console.error('WebSocket error:', error); |
|
|
onError('Connection error occurred'); |
|
|
}; |
|
|
|
|
|
return ws; |
|
|
} |
|
|
|
|
|
async deploy(request: DeploymentRequest): Promise<DeploymentResponse> { |
|
|
const response = await this.client.post<DeploymentResponse>('/api/deploy', request); |
|
|
return response.data; |
|
|
} |
|
|
|
|
|
logout() { |
|
|
this.token = null; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export const apiClient = new ApiClient(); |
|
|
|
|
|
|