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}