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}