001package org.nasdanika.ai.http;
002
003import java.util.List;
004
005import org.json.JSONObject;
006import org.nasdanika.ai.Chat;
007import org.nasdanika.html.alpinejs.AlpineJsFactory;
008import org.nasdanika.html.bootstrap.BootstrapFactory;
009import org.nasdanika.html.http.AbstractTelemetryChatRoutes;
010import org.nasdanika.http.TelemetryFilter;
011
012import reactor.core.publisher.Mono;
013
014public abstract class AbstractAIChatRoutes extends AbstractTelemetryChatRoutes {
015                        
016        protected Chat chat;
017        
018//      /**
019//       * @param chat
020//       */
021//      public AbstractAIChatRoutes(Chat chat) {
022//              this.chat = chat;
023//      }
024        
025        protected AbstractAIChatRoutes(
026                        BootstrapFactory bootstrapFactory, 
027                        AlpineJsFactory alpineJsFactory,
028                        TelemetryFilter telemetryFilter,
029                        Chat chat) {
030                super(bootstrapFactory, alpineJsFactory, telemetryFilter);
031                this.chat = chat;
032        }
033
034        protected AbstractAIChatRoutes(TelemetryFilter telemetryFilter, Chat chat) {
035                super(telemetryFilter);
036                this.chat = chat;
037        }
038
039        protected abstract Mono<List<Chat.Message>> generateChatRequestMessages(
040                        String chatId, 
041                        String question, 
042                        JSONObject config, 
043                        JSONObject context);
044
045        protected abstract Mono<String> generateResponseContent(
046                        String chatId, 
047                        String question, 
048                        List<? extends Chat.ResponseMessage> responses, 
049                        JSONObject config, 
050                        JSONObject context);
051        
052        @Override
053        protected final Mono<String> chatContent(String chatId, String question, JSONObject config, JSONObject context) {
054                return generateChatRequestMessages(chatId, question, config, context)
055                        .flatMap(chat::chatAsync)
056                        .flatMap(responses -> generateResponseContent(chatId, question, responses, config, context));
057        }
058        
059}