|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const FarmEyesAPI = { |
|
|
|
|
|
baseUrl: window.location.origin, |
|
|
|
|
|
|
|
|
sessionId: null, |
|
|
|
|
|
|
|
|
language: 'en', |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async init() { |
|
|
|
|
|
this.sessionId = localStorage.getItem('farmeyes_session'); |
|
|
this.language = localStorage.getItem('farmeyes_language') || 'en'; |
|
|
|
|
|
|
|
|
if (!this.sessionId) { |
|
|
await this.createSession(this.language); |
|
|
} |
|
|
|
|
|
console.log('[API] Initialized with session:', this.sessionId?.substring(0, 8)); |
|
|
return this; |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async request(endpoint, options = {}) { |
|
|
const url = `${this.baseUrl}${endpoint}`; |
|
|
|
|
|
const defaultOptions = { |
|
|
headers: { |
|
|
'Accept': 'application/json', |
|
|
}, |
|
|
}; |
|
|
|
|
|
|
|
|
const fetchOptions = { ...defaultOptions, ...options }; |
|
|
|
|
|
|
|
|
if (options.body && !(options.body instanceof FormData)) { |
|
|
fetchOptions.headers['Content-Type'] = 'application/json'; |
|
|
fetchOptions.body = JSON.stringify(options.body); |
|
|
} |
|
|
|
|
|
try { |
|
|
const response = await fetch(url, fetchOptions); |
|
|
|
|
|
|
|
|
const contentType = response.headers.get('content-type'); |
|
|
if (!contentType || !contentType.includes('application/json')) { |
|
|
if (!response.ok) { |
|
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`); |
|
|
} |
|
|
return { success: true }; |
|
|
} |
|
|
|
|
|
const data = await response.json(); |
|
|
|
|
|
if (!response.ok) { |
|
|
throw new Error(data.detail || data.error || `HTTP ${response.status}`); |
|
|
} |
|
|
|
|
|
return data; |
|
|
} catch (error) { |
|
|
console.error('[API] Request failed:', endpoint, error); |
|
|
throw error; |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async createSession(language = 'en') { |
|
|
const data = await this.request(`/api/session?language=${language}`); |
|
|
|
|
|
if (data.success && data.session_id) { |
|
|
this.sessionId = data.session_id; |
|
|
this.language = language; |
|
|
localStorage.setItem('farmeyes_session', this.sessionId); |
|
|
localStorage.setItem('farmeyes_language', language); |
|
|
console.log('[API] Session created:', this.sessionId.substring(0, 8)); |
|
|
} |
|
|
|
|
|
return data; |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getSession() { |
|
|
if (!this.sessionId) { |
|
|
return { success: false, error: 'No session' }; |
|
|
} |
|
|
return this.request(`/api/session/${this.sessionId}`); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async setLanguage(language) { |
|
|
if (!this.sessionId) { |
|
|
await this.createSession(language); |
|
|
return { success: true }; |
|
|
} |
|
|
|
|
|
const data = await this.request(`/api/session/${this.sessionId}/language?language=${language}`, { |
|
|
method: 'PUT' |
|
|
}); |
|
|
|
|
|
if (data.success) { |
|
|
this.language = language; |
|
|
localStorage.setItem('farmeyes_language', language); |
|
|
} |
|
|
|
|
|
return data; |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async resetSession() { |
|
|
if (this.sessionId) { |
|
|
try { |
|
|
await this.request(`/api/session/${this.sessionId}`, { method: 'DELETE' }); |
|
|
} catch (e) { |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
localStorage.removeItem('farmeyes_session'); |
|
|
this.sessionId = null; |
|
|
|
|
|
return this.createSession(this.language); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async detectDisease(imageFile, language = null) { |
|
|
const formData = new FormData(); |
|
|
formData.append('file', imageFile); |
|
|
formData.append('language', language || this.language); |
|
|
formData.append('session_id', this.sessionId || ''); |
|
|
|
|
|
const data = await this.request('/api/detect/', { |
|
|
method: 'POST', |
|
|
body: formData |
|
|
}); |
|
|
|
|
|
|
|
|
if (data.session_id) { |
|
|
this.sessionId = data.session_id; |
|
|
localStorage.setItem('farmeyes_session', this.sessionId); |
|
|
} |
|
|
|
|
|
return data; |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async detectDiseaseBase64(base64Image, language = null) { |
|
|
const data = await this.request('/api/detect/base64', { |
|
|
method: 'POST', |
|
|
body: { |
|
|
image_base64: base64Image, |
|
|
language: language || this.language, |
|
|
session_id: this.sessionId |
|
|
} |
|
|
}); |
|
|
|
|
|
if (data.session_id) { |
|
|
this.sessionId = data.session_id; |
|
|
localStorage.setItem('farmeyes_session', this.sessionId); |
|
|
} |
|
|
|
|
|
return data; |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getDetectionStatus() { |
|
|
return this.request('/api/detect/status'); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getClasses() { |
|
|
return this.request('/api/detect/classes'); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async clearDiagnosis() { |
|
|
if (!this.sessionId) { |
|
|
return { success: false, error: 'No session' }; |
|
|
} |
|
|
return this.request(`/api/detect/session/${this.sessionId}`, { |
|
|
method: 'DELETE' |
|
|
}); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async sendChatMessage(message, language = null) { |
|
|
if (!this.sessionId) { |
|
|
await this.createSession(language || this.language); |
|
|
} |
|
|
|
|
|
return this.request('/api/chat/', { |
|
|
method: 'POST', |
|
|
body: { |
|
|
session_id: this.sessionId, |
|
|
message: message, |
|
|
language: language || this.language |
|
|
} |
|
|
}); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getChatWelcome(language = null) { |
|
|
if (!this.sessionId) { |
|
|
return { success: false, error: 'No session' }; |
|
|
} |
|
|
|
|
|
const lang = language || this.language; |
|
|
return this.request(`/api/chat/welcome?session_id=${this.sessionId}&language=${lang}`); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getChatHistory(limit = 50) { |
|
|
if (!this.sessionId) { |
|
|
return { success: false, messages: [] }; |
|
|
} |
|
|
|
|
|
return this.request(`/api/chat/history?session_id=${this.sessionId}&limit=${limit}`); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async clearChatHistory() { |
|
|
if (!this.sessionId) { |
|
|
return { success: false }; |
|
|
} |
|
|
|
|
|
return this.request(`/api/chat/history?session_id=${this.sessionId}`, { |
|
|
method: 'DELETE' |
|
|
}); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getChatContext() { |
|
|
if (!this.sessionId) { |
|
|
return { success: false }; |
|
|
} |
|
|
|
|
|
return this.request(`/api/chat/context?session_id=${this.sessionId}`); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async transcribeAudio(audioFile, languageHint = null) { |
|
|
const formData = new FormData(); |
|
|
formData.append('file', audioFile, audioFile.name || 'audio.wav'); |
|
|
|
|
|
if (languageHint) { |
|
|
formData.append('language_hint', languageHint); |
|
|
} |
|
|
|
|
|
return this.request('/api/transcribe/', { |
|
|
method: 'POST', |
|
|
body: formData |
|
|
}); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async transcribeBase64(base64Audio, filename = 'audio.wav', languageHint = null) { |
|
|
return this.request('/api/transcribe/base64', { |
|
|
method: 'POST', |
|
|
body: { |
|
|
audio_base64: base64Audio, |
|
|
filename: filename, |
|
|
language_hint: languageHint |
|
|
} |
|
|
}); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getTranscriptionStatus() { |
|
|
return this.request('/api/transcribe/status'); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async loadWhisperModel() { |
|
|
return this.request('/api/transcribe/load-model', { |
|
|
method: 'POST' |
|
|
}); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getTranslations(language = null) { |
|
|
const lang = language || this.language; |
|
|
return this.request(`/api/translations?language=${lang}`); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async healthCheck() { |
|
|
return this.request('/health'); |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async getApiInfo() { |
|
|
return this.request('/api'); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
window.FarmEyesAPI = FarmEyesAPI; |
|
|
|