|
|
|
|
|
const API_CONFIG = { |
|
|
HUGGING_FACE_API_KEY: 'your-huggingface-api-key-here', |
|
|
BASE_URL: 'https://api-inference.huggingface.co/models/', |
|
|
MODELS: { |
|
|
TEXT_GENERATION: 'gpt2', |
|
|
IMAGE_GENERATION: 'runwayml/stable-diffusion-v1-5', |
|
|
SENTIMENT_ANALYSIS: 'cardiffnlp/twitter-roberta-base-sentiment-latest', |
|
|
TRANSLATION: 'Helsinki-NLP/opus-mt-en-fr', |
|
|
CODE_GENERATION: 'microsoft/DialoGPT-medium', |
|
|
AUDIO_PROCESSING: 'facebook/wav2vec2-base-960h' |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
class AgentUtils { |
|
|
static async makeAPIRequest(endpoint, data, model) { |
|
|
try { |
|
|
const response = await fetch(`${API_CONFIG.BASE_URL}${model}`, { |
|
|
method: 'POST', |
|
|
headers: { |
|
|
'Authorization': `Bearer ${API_CONFIG.HUGGING_FACE_API_KEY}`, |
|
|
'Content-Type': 'application/json', |
|
|
}, |
|
|
body: JSON.stringify(data) |
|
|
}); |
|
|
|
|
|
if (!response.ok) { |
|
|
throw new Error(`API request failed: ${response.status}`); |
|
|
} |
|
|
|
|
|
return await response.json(); |
|
|
} catch (error) { |
|
|
console.error('API Request Error:', error); |
|
|
throw error; |
|
|
} |
|
|
} |
|
|
|
|
|
static formatResponse(data, agentType) { |
|
|
switch (agentType) { |
|
|
case 'text': |
|
|
return data[0]?.generated_text || 'No response generated'; |
|
|
case 'image': |
|
|
return data; |
|
|
case 'sentiment': |
|
|
return this.formatSentiment(data); |
|
|
case 'translation': |
|
|
return data[0]?.translation_text || 'Translation failed'; |
|
|
case 'code': |
|
|
return data[0]?.generated_text || 'No code generated'; |
|
|
default: |
|
|
return data; |
|
|
} |
|
|
} |
|
|
|
|
|
static formatSentiment(data) { |
|
|
if (!Array.isArray(data)) return 'Unable to analyze sentiment'; |
|
|
|
|
|
const scores = data[0]; |
|
|
if (!scores) return 'No sentiment data available'; |
|
|
|
|
|
const labels = ['Negative', 'Neutral', 'Positive']; |
|
|
const maxScore = Math.max(...scores); |
|
|
const maxIndex = scores.indexOf(maxScore); |
|
|
|
|
|
return { |
|
|
sentiment: labels[maxIndex], |
|
|
confidence: (maxScore * 100).toFixed(2), |
|
|
scores: scores.map((score, index) => ({ |
|
|
label: labels[index], |
|
|
score: (score * 100).toFixed(2) |
|
|
}) |
|
|
}; |
|
|
} |
|
|
|
|
|
static showNotification(message, type = 'info') { |
|
|
const notification = document.createElement('div'); |
|
|
notification.className = `fixed top-4 right-4 p-4 rounded-lg shadow-lg z-50 fade-in ${ |
|
|
type === 'error' ? 'bg-red-500 text-white' : |
|
|
type === 'success' ? 'bg-green-500 text-white' : |
|
|
'bg-blue-500 text-white' |
|
|
}`; |
|
|
notification.textContent = message; |
|
|
document.body.appendChild(notification); |
|
|
|
|
|
setTimeout(() => { |
|
|
notification.remove(); |
|
|
}, 3000); |
|
|
} |
|
|
|
|
|
static toggleLoading(element, show) { |
|
|
if (show) { |
|
|
element.disabled = true; |
|
|
element.innerHTML = '<div class="loading-spinner"></div> Processing...'; |
|
|
} else { |
|
|
element.disabled = false; |
|
|
element.textContent = element.dataset.originalText || 'Submit'; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
class BaseAgent { |
|
|
constructor(type, model) { |
|
|
this.type = type; |
|
|
this.model = model; |
|
|
} |
|
|
|
|
|
async process(input) { |
|
|
try { |
|
|
const data = await AgentUtils.makeAPIRequest('', { inputs: input }, this.model); |
|
|
return AgentUtils.formatResponse(data, this.type); |
|
|
} catch (error) { |
|
|
AgentUtils.showNotification(`Agent error: ${error.message}`, 'error'); |
|
|
throw error; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
class TextGenerationAgent extends BaseAgent { |
|
|
constructor() { |
|
|
super('text', API_CONFIG.MODELS.TEXT_GENERATION); |
|
|
} |
|
|
} |
|
|
|
|
|
class ImageGenerationAgent extends BaseAgent { |
|
|
constructor() { |
|
|
super('image', API_CONFIG.MODELS.IMAGE_GENERATION); |
|
|
} |
|
|
|
|
|
async process(prompt) { |
|
|
try { |
|
|
const data = await AgentUtils.makeAPIRequest('', { inputs: prompt }, this.model); |
|
|
return data; |
|
|
} catch (error) { |
|
|
AgentUtils.showNotification(`Image generation failed: ${error.message}`, 'error'); |
|
|
throw error; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
class SentimentAnalysisAgent extends BaseAgent { |
|
|
constructor() { |
|
|
super('sentiment', API_CONFIG.MODELS.SENTIMENT_ANALYSIS); |
|
|
} |
|
|
} |
|
|
|
|
|
class TranslationAgent extends BaseAgent { |
|
|
constructor() { |
|
|
super('translation', API_CONFIG.MODELS.TRANSLATION); |
|
|
} |
|
|
} |
|
|
|
|
|
class CodeGenerationAgent extends BaseAgent { |
|
|
constructor() { |
|
|
super('code', API_CONFIG.MODELS.CODE_GENERATION); |
|
|
} |
|
|
} |
|
|
|
|
|
class AudioProcessingAgent extends BaseAgent { |
|
|
constructor() { |
|
|
super('audio', API_CONFIG.MODELS.AUDIO_PROCESSING); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
class AgentManager { |
|
|
constructor() { |
|
|
this.agents = { |
|
|
text: new TextGenerationAgent(), |
|
|
image: new ImageGenerationAgent(), |
|
|
sentiment: new SentimentAnalysisAgent(), |
|
|
translation: new TranslationAgent(), |
|
|
code: new CodeGenerationAgent(), |
|
|
audio: new AudioProcessingAgent() |
|
|
}; |
|
|
} |
|
|
|
|
|
getAgent(type) { |
|
|
return this.agents[type]; |
|
|
} |
|
|
|
|
|
async executeAgent(type, input) { |
|
|
const agent = this.getAgent(type); |
|
|
if (!agent) { |
|
|
throw new Error(`Agent type '${type}' not found`); |
|
|
} |
|
|
return await agent.process(input); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const agentManager = new AgentManager(); |
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
|
|
|
const textForm = document.getElementById('text-generation-form'); |
|
|
if (textForm) { |
|
|
textForm.addEventListener('submit', async function(e) { |
|
|
e.preventDefault(); |
|
|
const input = document.getElementById('text-input').value; |
|
|
const submitBtn = document.getElementById('text-submit-btn'); |
|
|
|
|
|
if (!input.trim()) { |
|
|
AgentUtils.showNotification('Please enter some text', 'error'); |
|
|
return; |
|
|
} |
|
|
|
|
|
AgentUtils.toggleLoading(submitBtn, true); |
|
|
|
|
|
try { |
|
|
const result = await agentManager.executeAgent('text', input); |
|
|
document.getElementById('text-result').textContent = result; |
|
|
} catch (error) { |
|
|
console.error('Text generation failed:', error); |
|
|
} finally { |
|
|
AgentUtils.toggleLoading(submitBtn, false); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
const imageForm = document.getElementById('image-generation-form'); |
|
|
if (imageForm) { |
|
|
imageForm.addEventListener('submit', async function(e) { |
|
|
e.preventDefault(); |
|
|
const prompt = document.getElementById('image-prompt').value; |
|
|
const submitBtn = document.getElementById('image-submit-btn'); |
|
|
|
|
|
if (!prompt.trim()) { |
|
|
AgentUtils.showNotification('Please enter an image description', 'error'); |
|
|
return; |
|
|
} |
|
|
|
|
|
AgentUtils.toggleLoading(submitBtn, true); |
|
|
|
|
|
try { |
|
|
const result = await agentManager.executeAgent('image', prompt); |
|
|
|
|
|
const imageResult = document.getElementById('image-result'); |
|
|
imageResult.innerHTML = ` |
|
|
<div class="text-center"> |
|
|
<img src="http://static.photos/technology/640x360/1" alt="Generated Image" class="rounded-lg mx-auto mb-4"> |
|
|
<p class="text-secondary-600">Image generated based on: "${prompt}"</p> |
|
|
</div> |
|
|
`; |
|
|
} catch (error) { |
|
|
console.error('Image generation failed:', error); |
|
|
} finally { |
|
|
AgentUtils.toggleLoading(submitBtn, false); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
}); |