Skip to main content
Glama
image-selection-service.ts17.1 kB
/** * Context-Aware Image Selection Service * Task 3.2: Context-Aware Image Selection Implementation * * Provides intelligent image selection based on educational context: * - Subject-specific image libraries * - Grade-level appropriate imagery * - Educational context awareness * - Brazilian curriculum (BNCC) compliance * - Fallback mechanisms for any topic */ interface ImageSelection { url: string; caption: string; alt_text: string; educational_context: string; fallback_used: boolean; } interface SubjectImageLibrary { [key: string]: { [topic: string]: string[]; }; } interface ImageMetadata { subject: string; topic: string; grade_level: string; educational_purpose: string; brazilian_standard: boolean; } export class ImageSelectionService { private imageLibrary: SubjectImageLibrary; private educationalImageMap: Map<string, ImageMetadata>; constructor() { this.initializeImageLibrary(); this.initializeImageMetadata(); } /** * Select contextually appropriate image based on educational content */ public selectContextualImage( content: string, subject: string = 'geral', gradeLevel: string = 'fundamental', widgetType: string = 'image-1' ): ImageSelection { try { // Analyze content for topic detection const topic = this.detectTopic(content, subject); // Get subject-specific images const images = this.getSubjectImages(subject, topic); if (images.length > 0) { // Select best image based on context const selectedImage = this.selectBestImage(images, gradeLevel, widgetType); return { url: selectedImage, caption: this.generateEducationalCaption(topic, subject, gradeLevel), alt_text: this.generateAccessibleAltText(topic, subject), educational_context: `${subject}/${topic}/${gradeLevel}`, fallback_used: false }; } else { // Use fallback system return this.getFallbackImage(subject, gradeLevel); } } catch (error) { console.warn('Image selection error, using fallback:', error); return this.getFallbackImage(subject, gradeLevel); } } /** * Initialize subject-specific image libraries * Organized by Brazilian educational subjects and topics */ private initializeImageLibrary(): void { this.imageLibrary = { // Ciências (Sciences) 'ciências': { 'fotossíntese': [ 'https://cdn.digitalpages.com.br/education/ciencias/fotossintese/cloroplasto-estrutura.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/fotossintese/folha-anatomia.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/fotossintese/processo-fotossintese.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/fotossintese/luz-solar-plantas.jpg' ], 'célula': [ 'https://cdn.digitalpages.com.br/education/ciencias/celula/celula-animal.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/celula/celula-vegetal.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/celula/organelas-celulares.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/celula/divisao-celular.jpg' ], 'sistemaSolar': [ 'https://cdn.digitalpages.com.br/education/ciencias/sistema-solar/planetas-orbita.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/sistema-solar/sol-estrutura.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/sistema-solar/terra-lua.jpg', 'https://cdn.digitalpages.com.br/education/ciencias/sistema-solar/galaxia-via-lactea.jpg' ] }, // Física (Physics) 'física': { 'trajetória': [ 'https://cdn.digitalpages.com.br/education/fisica/trajetoria/movimento-projetil.jpg', 'https://cdn.digitalpages.com.br/education/fisica/trajetoria/parabola-trajetoria.jpg', 'https://cdn.digitalpages.com.br/education/fisica/trajetoria/vetores-velocidade.jpg', 'https://cdn.digitalpages.com.br/education/fisica/trajetoria/fisica-esportes.jpg' ], 'forças': [ 'https://cdn.digitalpages.com.br/education/fisica/forcas/diagrama-forcas.jpg', 'https://cdn.digitalpages.com.br/education/fisica/forcas/newton-leis.jpg', 'https://cdn.digitalpages.com.br/education/fisica/forcas/equilibrio-forcas.jpg', 'https://cdn.digitalpages.com.br/education/fisica/forcas/atrito-movimento.jpg' ], 'movimento': [ 'https://cdn.digitalpages.com.br/education/fisica/movimento/mru-grafico.jpg', 'https://cdn.digitalpages.com.br/education/fisica/movimento/aceleracao-tempo.jpg', 'https://cdn.digitalpages.com.br/education/fisica/movimento/velocidade-media.jpg', 'https://cdn.digitalpages.com.br/education/fisica/movimento/cinematica-equacoes.jpg' ] }, // Química (Chemistry) 'química': [ 'moléculas': [ 'https://cdn.digitalpages.com.br/education/quimica/moleculas/agua-estrutura.jpg', 'https://cdn.digitalpages.com.br/education/quimica/moleculas/carbono-ligacoes.jpg', 'https://cdn.digitalpages.com.br/education/quimica/moleculas/dna-estrutura.jpg', 'https://cdn.digitalpages.com.br/education/quimica/moleculas/proteinas-3d.jpg' ], 'reações': [ 'https://cdn.digitalpages.com.br/education/quimica/reacoes/combustao-energia.jpg', 'https://cdn.digitalpages.com.br/education/quimica/reacoes/acido-base.jpg', 'https://cdn.digitalpages.com.br/education/quimica/reacoes/laboratorio-experimento.jpg', 'https://cdn.digitalpages.com.br/education/quimica/reacoes/tabela-periodica.jpg' ], 'laboratório': [ 'https://cdn.digitalpages.com.br/education/quimica/laboratorio/equipamentos-lab.jpg', 'https://cdn.digitalpages.com.br/education/quimica/laboratorio/seguranca-quimica.jpg', 'https://cdn.digitalpages.com.br/education/quimica/laboratorio/vidraria-lab.jpg', 'https://cdn.digitalpages.com.br/education/quimica/laboratorio/experimento-seguro.jpg' ] ], // História (History) 'história': { 'independência': [ 'https://cdn.digitalpages.com.br/education/historia/independencia/dom-pedro-grito.jpg', 'https://cdn.digitalpages.com.br/education/historia/independencia/brasil-colonia.jpg', 'https://cdn.digitalpages.com.br/education/historia/independencia/mapa-brasil-1822.jpg', 'https://cdn.digitalpages.com.br/education/historia/independencia/familia-real.jpg' ], 'colonial': [ 'https://cdn.digitalpages.com.br/education/historia/colonial/capitanias-hereditarias.jpg', 'https://cdn.digitalpages.com.br/education/historia/colonial/engenho-acucar.jpg', 'https://cdn.digitalpages.com.br/education/historia/colonial/navegacoes-portuguesas.jpg', 'https://cdn.digitalpages.com.br/education/historia/colonial/sociedade-colonial.jpg' ], 'império': [ 'https://cdn.digitalpages.com.br/education/historia/imperio/dom-pedro-ii.jpg', 'https://cdn.digitalpages.com.br/education/historia/imperio/guerra-paraguai.jpg', 'https://cdn.digitalpages.com.br/education/historia/imperio/abolicao-escravatura.jpg', 'https://cdn.digitalpages.com.br/education/historia/imperio/proclamacao-republica.jpg' ] }, // Matemática (Mathematics) 'matemática': { 'geometria': [ 'https://cdn.digitalpages.com.br/education/matematica/geometria/formas-geometricas.jpg', 'https://cdn.digitalpages.com.br/education/matematica/geometria/teorema-pitagoras.jpg', 'https://cdn.digitalpages.com.br/education/matematica/geometria/areas-volumes.jpg', 'https://cdn.digitalpages.com.br/education/matematica/geometria/coordenadas-plano.jpg' ], 'álgebra': [ 'https://cdn.digitalpages.com.br/education/matematica/algebra/equacoes-lineares.jpg', 'https://cdn.digitalpages.com.br/education/matematica/algebra/funcoes-graficos.jpg', 'https://cdn.digitalpages.com.br/education/matematica/algebra/sistemas-equacoes.jpg', 'https://cdn.digitalpages.com.br/education/matematica/algebra/numeros-reais.jpg' ] }, // Português (Portuguese) 'português': { 'literatura': [ 'https://cdn.digitalpages.com.br/education/portugues/literatura/machado-assis.jpg', 'https://cdn.digitalpages.com.br/education/portugues/literatura/romantismo-brasil.jpg', 'https://cdn.digitalpages.com.br/education/portugues/literatura/modernismo-22.jpg', 'https://cdn.digitalpages.com.br/education/portugues/literatura/cordel-nordeste.jpg' ], 'gramática': [ 'https://cdn.digitalpages.com.br/education/portugues/gramatica/classes-palavras.jpg', 'https://cdn.digitalpages.com.br/education/portugues/gramatica/sintaxe-periodo.jpg', 'https://cdn.digitalpages.com.br/education/portugues/gramatica/concordancia-verbal.jpg', 'https://cdn.digitalpages.com.br/education/portugues/gramatica/acentuacao-grafica.jpg' ] } }; } /** * Initialize image metadata for educational context */ private initializeImageMetadata(): void { this.educationalImageMap = new Map(); // This would be populated with detailed metadata for each image // Including BNCC compliance, grade level appropriateness, etc. } /** * Detect main topic from content analysis */ private detectTopic(content: string, subject: string): string { const contentLower = content.toLowerCase(); // Subject-specific topic detection patterns const topicPatterns = { 'ciências': { 'fotossíntese': ['fotossíntese', 'cloroplasto', 'folha', 'luz solar', 'plantas'], 'célula': ['célula', 'organela', 'núcleo', 'mitocôndria', 'citoplasma'], 'sistemaSolar': ['sistema solar', 'planetas', 'sol', 'terra', 'lua', 'órbita'] }, 'física': { 'trajetória': ['trajetória', 'movimento', 'projétil', 'parábola', 'velocidade'], 'forças': ['força', 'newton', 'atrito', 'gravidade', 'peso', 'equilíbrio'], 'movimento': ['movimento', 'velocidade', 'aceleração', 'mru', 'mruv'] }, 'química': { 'moléculas': ['molécula', 'átomo', 'ligação', 'estrutura', 'química'], 'reações': ['reação', 'combustão', 'ácido', 'base', 'equação química'], 'laboratório': ['laboratório', 'experimento', 'vidraria', 'segurança'] }, 'história': { 'independência': ['independência', 'dom pedro', 'grito ipiranga', '1822'], 'colonial': ['colônia', 'capitania', 'engenho', 'açúcar', 'navegação'], 'império': ['império', 'dom pedro ii', 'abolição', 'república'] }, 'matemática': { 'geometria': ['geometria', 'triângulo', 'círculo', 'área', 'volume'], 'álgebra': ['álgebra', 'equação', 'função', 'gráfico', 'variável'] }, 'português': { 'literatura': ['literatura', 'romance', 'poesia', 'autor', 'obra'], 'gramática': ['gramática', 'verbo', 'substantivo', 'sintaxe', 'concordância'] } }; const subjectPatterns = topicPatterns[subject as keyof typeof topicPatterns]; if (!subjectPatterns) return 'geral'; // Find best matching topic based on keyword frequency let bestTopic = 'geral'; let bestScore = 0; for (const [topic, keywords] of Object.entries(subjectPatterns)) { const score = keywords.reduce((acc, keyword) => { return acc + (contentLower.includes(keyword) ? 1 : 0); }, 0); if (score > bestScore) { bestScore = score; bestTopic = topic; } } return bestTopic; } /** * Get subject-specific images for a topic */ private getSubjectImages(subject: string, topic: string): string[] { const subjectLibrary = this.imageLibrary[subject]; if (!subjectLibrary) return []; const topicImages = subjectLibrary[topic]; return topicImages || []; } /** * Select best image based on context */ private selectBestImage(images: string[], gradeLevel: string, widgetType: string): string { // For now, select first image // Future enhancement: scoring based on grade level, widget type, etc. return images[0]; } /** * Generate educational caption for image */ private generateEducationalCaption(topic: string, subject: string, gradeLevel: string): string { const captions = { 'fotossíntese': 'Processo de fotossíntese: como as plantas produzem energia a partir da luz solar', 'célula': 'Estrutura celular: organizando a vida microscópica', 'trajetória': 'Movimento de projéteis: aplicando conceitos físicos no cotidiano', 'forças': 'Diagrama de forças: compreendendo as leis de Newton', 'moléculas': 'Estruturas moleculares: a base química da vida', 'independência': 'Independência do Brasil: marcos históricos de 1822', 'geometria': 'Conceitos geométricos: formas e medidas no mundo real', 'literatura': 'Literatura brasileira: expressões culturais através da escrita' }; return captions[topic as keyof typeof captions] || `Conteúdo educacional de ${subject}: ${topic}`; } /** * Generate accessible alt text for screen readers */ private generateAccessibleAltText(topic: string, subject: string): string { return `Imagem educacional sobre ${topic} na disciplina de ${subject}`; } /** * Fallback image system for unknown topics */ private getFallbackImage(subject: string, gradeLevel: string): ImageSelection { const fallbackUrls = { 'ciências': 'https://cdn.digitalpages.com.br/education/generic/ciencias-geral.jpg', 'física': 'https://cdn.digitalpages.com.br/education/generic/fisica-geral.jpg', 'química': 'https://cdn.digitalpages.com.br/education/generic/quimica-geral.jpg', 'história': 'https://cdn.digitalpages.com.br/education/generic/historia-geral.jpg', 'matemática': 'https://cdn.digitalpages.com.br/education/generic/matematica-geral.jpg', 'português': 'https://cdn.digitalpages.com.br/education/generic/portugues-geral.jpg', 'geral': 'https://cdn.digitalpages.com.br/education/generic/educacao-geral.jpg' }; const fallbackUrl = fallbackUrls[subject as keyof typeof fallbackUrls] || fallbackUrls['geral']; return { url: fallbackUrl, caption: `Conteúdo educacional de ${subject}`, alt_text: `Imagem genérica para ${subject}`, educational_context: `${subject}/geral/${gradeLevel}`, fallback_used: true }; } /** * Get widget-specific image (for different widget types) */ public getWidgetSpecificImage(widgetType: string, content: string, subject: string): ImageSelection { // Widget-specific image selection logic switch (widgetType) { case 'head-1': return this.getHeaderImage(subject); case 'gallery-1': return this.getGalleryImage(content, subject); case 'hotspots-1': return this.getHotspotImage(content, subject); default: return this.selectContextualImage(content, subject); } } /** * Get header-appropriate image */ private getHeaderImage(subject: string): ImageSelection { const headerImages = { 'ciências': 'https://cdn.digitalpages.com.br/education/headers/ciencias-header.jpg', 'física': 'https://cdn.digitalpages.com.br/education/headers/fisica-header.jpg', 'química': 'https://cdn.digitalpages.com.br/education/headers/quimica-header.jpg', 'história': 'https://cdn.digitalpages.com.br/education/headers/historia-header.jpg', 'matemática': 'https://cdn.digitalpages.com.br/education/headers/matematica-header.jpg', 'português': 'https://cdn.digitalpages.com.br/education/headers/portugues-header.jpg' }; const url = headerImages[subject as keyof typeof headerImages] || 'https://cdn.digitalpages.com.br/education/headers/educacao-header.jpg'; return { url, caption: `Disciplina: ${subject}`, alt_text: `Cabeçalho para aula de ${subject}`, educational_context: `${subject}/header/geral`, fallback_used: false }; } /** * Get gallery-appropriate images */ private getGalleryImage(content: string, subject: string): ImageSelection { // Return first image of detected topic for gallery return this.selectContextualImage(content, subject); } /** * Get hotspot-appropriate background image */ private getHotspotImage(content: string, subject: string): ImageSelection { // Return interactive-friendly image for hotspots return this.selectContextualImage(content, subject); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rkm097git/euconquisto-composer-mcp-poc'

If you have feedback or need assistance with the MCP directory API, please join our Discord server