001package org.nasdanika.ai; 002 003import java.util.Arrays; 004import java.util.List; 005 006import reactor.core.publisher.Mono; 007 008public interface Chat extends Model { 009 010 /** 011 * Chat requirement. 012 * String attributes match any value if null. 013 */ 014 record Requirement( 015 String provider, 016 String model, 017 String version) {} 018 019 interface Message { 020 021 String getRole(); 022 023 String getContent(); 024 025 static Message create(String role, String content) { 026 return new Message() { 027 028 @Override 029 public String getRole() { 030 return role; 031 } 032 033 @Override 034 public String getContent() { 035 return content; 036 } 037 038 }; 039 040 } 041 042 } 043 044 interface ResponseMessage extends Message { 045 046 String getRefusal(); 047 048 String getFinishReason(); 049 050 } 051 052 enum Role { 053 054 system, 055 assistant, 056 user, 057 function, 058 tool, 059 developer; 060 061 public Message createMessage(String content) { 062 return Message.create(name(), content); 063 } 064 065 } 066 067 Mono<List<ResponseMessage>> chatAsync(List<Message> messages); 068 069 default Mono<List<ResponseMessage>> chatAsync(Message... messages) { 070 return chatAsync(Arrays.asList(messages)); 071 } 072 073 default List<ResponseMessage> chat(List<Message> messages) { 074 return chatAsync(messages).block(); 075 } 076 077 default List<ResponseMessage> chat(Message... messages) { 078 return chat(Arrays.asList(messages)); 079 } 080 081 int getMaxOutputTokens(); 082 083}