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}