001package org.nasdanika.ai;
002
003import java.awt.image.BufferedImage;
004import java.util.List;
005
006import org.nasdanika.ai.Chat.ResponseMessage;
007
008import reactor.core.publisher.Mono;
009
010public class ChatImageNarrator implements ImageNarrator {
011        
012        private Chat chat;
013        private String prompt;
014
015        public ChatImageNarrator(Chat chat, String prompt) {
016                this.chat = chat;
017                this.prompt = prompt;
018        }
019        
020        public ChatImageNarrator(Chat chat) {
021                this(chat, "Describe this image");
022        }
023
024        @Override
025        public Mono<String> generateAsync(BufferedImage input) {
026        Mono<List<ResponseMessage>> responses = chat.chatAsync(
027                Chat.Role.user.createMessage(prompt).addImage(input)
028        );
029                
030        return responses.map(responseMessages -> {
031                StringBuilder resultBuilder = new StringBuilder();
032                for (ResponseMessage responseMessage: responseMessages) {
033                        if (resultBuilder.length() > 0) {
034                                resultBuilder.append(System.lineSeparator());
035                        }
036                        resultBuilder.append(responseMessage.getContent());
037                }
038                
039                return resultBuilder.toString();                
040        });
041        }
042        
043        @Override
044        public String generate(BufferedImage input) {        
045        List<ResponseMessage> responses = chat.chat(
046                Chat.Role.user.createMessage(prompt).addImage(input)
047        );
048        
049        StringBuilder resultBuilder = new StringBuilder();
050        for (ResponseMessage response: responses) {
051                if (resultBuilder.length() > 0) {
052                        resultBuilder.append(System.lineSeparator());
053                }
054                resultBuilder.append(response.getContent());
055        }
056                
057                return resultBuilder.toString();
058        }
059
060}