diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..5b89836 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,41 @@ +pipeline { + agent any + tools { + maven '3.9.6' + } + stages { + stage('Setup') { + steps { + sh "chmod +x -R ${env.WORKSPACE}" + sh "git submodule update --init --recursive" // make sure submodules are also checked out + } + } + stage ('Check Environment') { + steps { + sh 'mvn --version' + sh 'java -version' + sh 'echo $JAVA_HOME' + sh 'echo $JAVA_INCLUDE_PATH' + } + } + stage('Build (Engine)') { + steps { + sh 'mvn -B -DskipTests clean package' + } + } + stage('Test') { + steps { + script { + catchError { + sh 'mvn test' + } + } + } + post { + always { + junit testResults: 'target/surefire-reports/*.xml', keepLongStdio: true, testDataPublishers: [[$class:'AttachmentPublisher']] + } + } + } + } +} \ No newline at end of file diff --git a/data/test/webs/web.json b/data/test/webs/web.json index 9029418..6012496 100644 --- a/data/test/webs/web.json +++ b/data/test/webs/web.json @@ -1,4 +1,5 @@ { + "selfId": 2, "nodes" : { "0" : { "id" : 0, @@ -18,7 +19,7 @@ }, "4" : { "id" : 4, - "name" : "ConversationParticipant" + "name" : "Other" } }, "relations" : { @@ -39,6 +40,12 @@ "name" : "InstanceOf", "parent" : 1, "child" : 0 + }, + "3" : { + "id" : 3, + "name" : "InstanceOf", + "parent" : 3, + "child" : 4 } } } \ No newline at end of file diff --git a/src/main/java/org/studiorailgun/Globals.java b/src/main/java/org/studiorailgun/Globals.java index 7a9557a..ddea2c9 100644 --- a/src/main/java/org/studiorailgun/Globals.java +++ b/src/main/java/org/studiorailgun/Globals.java @@ -2,6 +2,7 @@ package org.studiorailgun; import java.io.File; +import org.studiorailgun.conversation.Conversation; import org.studiorailgun.knowledge.KnowledgeWeb; /** @@ -14,12 +15,26 @@ public class Globals { */ public static KnowledgeWeb web; + /** + * The current conversation + */ + public static Conversation conversation; + /** * Initializes the knowledge web */ public static void init(){ - web = FileUtils.loadObjectFromFile(new File("web.json"), KnowledgeWeb.class); - web.initLinks(); + Globals.loadWeb("web.json"); + } + + /** + * Loads a web + * @param webPath The web's path + */ + public static void loadWeb(String webPath){ + Globals.web = FileUtils.loadObjectFromFile(new File("web.json"), KnowledgeWeb.class); + Globals.web.initLinks(); + Globals.conversation = Conversation.parse(Globals.web); } } diff --git a/src/main/java/org/studiorailgun/conversation/AgentLoop.java b/src/main/java/org/studiorailgun/conversation/AgentLoop.java index c38d667..82ae190 100644 --- a/src/main/java/org/studiorailgun/conversation/AgentLoop.java +++ b/src/main/java/org/studiorailgun/conversation/AgentLoop.java @@ -3,10 +3,10 @@ package org.studiorailgun.conversation; import java.util.Scanner; import org.studiorailgun.Globals; +import org.studiorailgun.conversation.llm.Actor; +import org.studiorailgun.conversation.llm.LLMConversation; +import org.studiorailgun.conversation.llm.Statement; import org.studiorailgun.conversation.parser.CommandParser; -import org.studiorailgun.conversation.tracking.Actor; -import org.studiorailgun.conversation.tracking.Conversation; -import org.studiorailgun.conversation.tracking.Statement; public class AgentLoop { @@ -30,7 +30,7 @@ public class AgentLoop { String prompt = ""; //setup conversation tracking - Conversation convo = new Conversation(); + LLMConversation convo = new LLMConversation(); Actor player = new Actor("John"); Actor ai = new Actor("Dave"); convo.addParticipant(player); diff --git a/src/main/java/org/studiorailgun/conversation/ConvParticipant.java b/src/main/java/org/studiorailgun/conversation/ConvParticipant.java new file mode 100644 index 0000000..d52028a --- /dev/null +++ b/src/main/java/org/studiorailgun/conversation/ConvParticipant.java @@ -0,0 +1,31 @@ +package org.studiorailgun.conversation; + +import org.studiorailgun.knowledge.Node; + +/** + * A participant in a conversation + */ +public class ConvParticipant { + + /** + * The corresponding node in the knowledge web that represents this participant + */ + Node data; + + /** + * Constructor + * @param data The node in the knowledge web that represents this participant + */ + public ConvParticipant(Node data){ + this.data = data; + } + + /** + * Gets the node in the knowledge web that represents this participant + * @return The node in the knowledge web that represents this participant + */ + public Node getData(){ + return data; + } + +} diff --git a/src/main/java/org/studiorailgun/conversation/Conversation.java b/src/main/java/org/studiorailgun/conversation/Conversation.java new file mode 100644 index 0000000..b956d40 --- /dev/null +++ b/src/main/java/org/studiorailgun/conversation/Conversation.java @@ -0,0 +1,76 @@ +package org.studiorailgun.conversation; + +import org.studiorailgun.conversation.evaluators.GreetingData; +import org.studiorailgun.knowledge.KnowledgeWeb; + +/** + * A conversation + */ +public class Conversation { + + /** + * The self instance + */ + ConvParticipant self; + + /** + * The other participant in the conversation + */ + ConvParticipant other; + + /** + * Data on greetings + */ + GreetingData greetingData; + + /** + * Parses the current conversation's data from the knowledge web + * @param web The web + * @return The conversation + */ + public static Conversation parse(KnowledgeWeb web){ + //find the self + ConvParticipant self = new ConvParticipant(web.getSelf()); + + //find the other participant + ConvParticipant other = new ConvParticipant(web.getNode(4)); + + Conversation rVal = new Conversation(self, other); + return rVal; + } + + /** + * Constructor + * @param self The participant representing this bot instance + * @param other The participant representing the other party in the conversation + */ + public Conversation(ConvParticipant self, ConvParticipant other){ + this.self = self; + this.other = other; + } + + /** + * Gets the greeting data + * @return The greeting data + */ + public GreetingData getGreetingData(){ + return greetingData; + } + + /** + * Gets the self + * @return The self + */ + public ConvParticipant getSelf(){ + return self; + } + + /** + * Gets the other + * @return The other + */ + public ConvParticipant getOther(){ + return other; + } + +} diff --git a/src/main/java/org/studiorailgun/conversation/evaluators/GreetingData.java b/src/main/java/org/studiorailgun/conversation/evaluators/GreetingData.java new file mode 100644 index 0000000..4904439 --- /dev/null +++ b/src/main/java/org/studiorailgun/conversation/evaluators/GreetingData.java @@ -0,0 +1,26 @@ +package org.studiorailgun.conversation.evaluators; + +import java.util.LinkedList; +import java.util.List; + +import org.studiorailgun.conversation.ConvParticipant; + +/** + * Data about greetings for a given conversation + */ +public class GreetingData { + + /** + * The list of participants that have greeted themselves + */ + List haveGreeted = new LinkedList(); + + /** + * Gets the list of participants that have greeted themselves + * @return The list + */ + public List getHaveGreeted(){ + return haveGreeted; + } + +} diff --git a/src/main/java/org/studiorailgun/conversation/evaluators/GreetingEval.java b/src/main/java/org/studiorailgun/conversation/evaluators/GreetingEval.java index 247fb92..979e7a6 100644 --- a/src/main/java/org/studiorailgun/conversation/evaluators/GreetingEval.java +++ b/src/main/java/org/studiorailgun/conversation/evaluators/GreetingEval.java @@ -5,6 +5,8 @@ import java.io.IOException; import java.nio.file.Files; import java.util.List; +import org.studiorailgun.conversation.Conversation; + /** * Evaluates a greeting */ @@ -30,7 +32,7 @@ public class GreetingEval { * Evaluates a greeting * @param input The sentence */ - public static void evaluate(String input){ + public static void evaluate(Conversation conversation, String input){ if(greetingStrings.contains(input)){ System.out.println("Contained!"); } diff --git a/src/main/java/org/studiorailgun/conversation/tracking/Actor.java b/src/main/java/org/studiorailgun/conversation/llm/Actor.java similarity index 92% rename from src/main/java/org/studiorailgun/conversation/tracking/Actor.java rename to src/main/java/org/studiorailgun/conversation/llm/Actor.java index 90b8692..2c6e9a9 100644 --- a/src/main/java/org/studiorailgun/conversation/tracking/Actor.java +++ b/src/main/java/org/studiorailgun/conversation/llm/Actor.java @@ -1,4 +1,4 @@ -package org.studiorailgun.conversation.tracking; +package org.studiorailgun.conversation.llm; /** * A character in a conversation who can say statements diff --git a/src/main/java/org/studiorailgun/conversation/tracking/Conversation.java b/src/main/java/org/studiorailgun/conversation/llm/LLMConversation.java similarity index 97% rename from src/main/java/org/studiorailgun/conversation/tracking/Conversation.java rename to src/main/java/org/studiorailgun/conversation/llm/LLMConversation.java index 25264fc..93a0bfc 100644 --- a/src/main/java/org/studiorailgun/conversation/tracking/Conversation.java +++ b/src/main/java/org/studiorailgun/conversation/llm/LLMConversation.java @@ -1,11 +1,11 @@ -package org.studiorailgun.conversation.tracking; +package org.studiorailgun.conversation.llm; import java.util.LinkedList; import org.studiorailgun.kobold.KoboldRequest; import org.studiorailgun.kobold.KoboldSymbols; -public class Conversation { +public class LLMConversation { /** * The participants in the conversation @@ -25,7 +25,7 @@ public class Conversation { /** * Constructor */ - public Conversation(){ + public LLMConversation(){ this.participants = new LinkedList(); this.statements = new LinkedList(); } diff --git a/src/main/java/org/studiorailgun/conversation/LLMLoop.java b/src/main/java/org/studiorailgun/conversation/llm/LLMLoop.java similarity index 85% rename from src/main/java/org/studiorailgun/conversation/LLMLoop.java rename to src/main/java/org/studiorailgun/conversation/llm/LLMLoop.java index 97a18ca..f453691 100644 --- a/src/main/java/org/studiorailgun/conversation/LLMLoop.java +++ b/src/main/java/org/studiorailgun/conversation/llm/LLMLoop.java @@ -1,11 +1,8 @@ -package org.studiorailgun.conversation; +package org.studiorailgun.conversation.llm; import java.util.Scanner; import org.studiorailgun.conversation.parser.CommandParser; -import org.studiorailgun.conversation.tracking.Actor; -import org.studiorailgun.conversation.tracking.Conversation; -import org.studiorailgun.conversation.tracking.Statement; import org.studiorailgun.kobold.KoboldPrinter; import org.studiorailgun.kobold.KoboldRequest; @@ -31,7 +28,7 @@ public class LLMLoop { String prompt = ""; //setup conversation tracking - Conversation convo = new Conversation(); + LLMConversation convo = new LLMConversation(); Actor player = new Actor("John"); Actor ai = new Actor("Dave"); convo.addParticipant(player); diff --git a/src/main/java/org/studiorailgun/conversation/tracking/Statement.java b/src/main/java/org/studiorailgun/conversation/llm/Statement.java similarity index 86% rename from src/main/java/org/studiorailgun/conversation/tracking/Statement.java rename to src/main/java/org/studiorailgun/conversation/llm/Statement.java index 74f17af..ae8c616 100644 --- a/src/main/java/org/studiorailgun/conversation/tracking/Statement.java +++ b/src/main/java/org/studiorailgun/conversation/llm/Statement.java @@ -1,4 +1,4 @@ -package org.studiorailgun.conversation.tracking; +package org.studiorailgun.conversation.llm; /** * A statement by a character in a conversation @@ -28,7 +28,7 @@ public class Statement { /** * The conversation this statement was uttered in */ - Conversation conversation; + LLMConversation conversation; /** * Creates a statement @@ -66,11 +66,11 @@ public class Statement { this.actor = actor; } - public Conversation getConversation() { + public LLMConversation getConversation() { return conversation; } - public void setConversation(Conversation conversation) { + public void setConversation(LLMConversation conversation) { this.conversation = conversation; } diff --git a/src/main/java/org/studiorailgun/conversation/parser/CommandParser.java b/src/main/java/org/studiorailgun/conversation/parser/CommandParser.java index 04f6011..3341885 100644 --- a/src/main/java/org/studiorailgun/conversation/parser/CommandParser.java +++ b/src/main/java/org/studiorailgun/conversation/parser/CommandParser.java @@ -1,7 +1,7 @@ package org.studiorailgun.conversation.parser; import org.studiorailgun.conversation.AgentLoop; -import org.studiorailgun.conversation.LLMLoop; +import org.studiorailgun.conversation.llm.LLMLoop; import org.studiorailgun.knowledge.CSVExport; /** diff --git a/src/main/java/org/studiorailgun/knowledge/KnowledgeWeb.java b/src/main/java/org/studiorailgun/knowledge/KnowledgeWeb.java index 08a8242..cf17746 100644 --- a/src/main/java/org/studiorailgun/knowledge/KnowledgeWeb.java +++ b/src/main/java/org/studiorailgun/knowledge/KnowledgeWeb.java @@ -28,6 +28,14 @@ public class KnowledgeWeb { */ transient Map> typeRelationLookup; + /** + * The node that represents the current ai + */ + int selfId; + + /** + * Constructor + */ public KnowledgeWeb(){ this.nodes = new HashMap(); this.relations = new HashMap(); @@ -65,14 +73,27 @@ public class KnowledgeWeb { } } + /** + * Gets the collection of all nodes + * @return The collection + */ public Collection getNodes() { return nodes.values(); } + /** + * Gets the collection of all relations + * @return The collection of all relations + */ public Collection getRelations() { return relations.values(); } + /** + * Gets a node by its id + * @param id The id + * @return The node + */ public Node getNode(int id){ return nodes.get(id); } @@ -94,6 +115,14 @@ public class KnowledgeWeb { } return null; } + + /** + * Gets the node that represents the ai + * @return The node + */ + public Node getSelf(){ + return this.getNode(this.selfId); + } } diff --git a/src/test/java/org/studiorailgun/ConvLoadingTests.java b/src/test/java/org/studiorailgun/ConvLoadingTests.java new file mode 100644 index 0000000..952f1aa --- /dev/null +++ b/src/test/java/org/studiorailgun/ConvLoadingTests.java @@ -0,0 +1,27 @@ +package org.studiorailgun; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.File; + +import org.junit.jupiter.api.Test; +import org.studiorailgun.conversation.Conversation; +import org.studiorailgun.knowledge.KnowledgeWeb; + +/** + * Tests loading conversations + */ +public class ConvLoadingTests { + + @Test + public void testLoadConversation(){ + KnowledgeWeb web = FileUtils.loadObjectFromFile(new File("./data/test/webs/web.json"), KnowledgeWeb.class); + web.initLinks(); + Globals.web = web; + Conversation convo = Conversation.parse(web); + assertEquals(web.getSelf(), convo.getSelf().getData()); + assertNotEquals(web.getSelf(), convo.getOther().getData()); + } + + +}