Skip to content

Commit

Permalink
move personas into a new module
Browse files Browse the repository at this point in the history
  • Loading branch information
jdbranham committed Jun 15, 2024
1 parent 031a5af commit a18240d
Show file tree
Hide file tree
Showing 29 changed files with 402 additions and 170 deletions.
107 changes: 107 additions & 0 deletions module-agents/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<artifactId>nexus-command</artifactId>
<groupId>net.savantly</groupId>
<version>3.0.0</version>
</parent>

<artifactId>agents-module</artifactId>
<name>Nexus Command - Agents Module</name>

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<filtering>false</filtering>
<directory>src/main/java</directory>
<includes>
<include>**</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>

<dependencies>

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>common-types-module</artifactId>
</dependency>

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>encryption-module</artifactId>
</dependency>

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>organizations-module</artifactId>
</dependency>

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>nexus-ai-module</artifactId>
</dependency>

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>nexus-audited-entity-module</artifactId>
</dependency>

<!-- Spring -->


<!-- CAUSEWAY API -->

<dependency>
<groupId>org.apache.causeway.core</groupId>
<artifactId>causeway-applib</artifactId>
</dependency>


<dependency>
<groupId>org.apache.causeway.valuetypes</groupId>
<artifactId>causeway-valuetypes-markdown-applib</artifactId>
</dependency>

<dependency>
<groupId>org.apache.causeway.persistence</groupId>
<artifactId>causeway-persistence-jpa-applib</artifactId>
</dependency>

<dependency>
<groupId>org.apache.causeway.testing</groupId>
<artifactId>causeway-testing-fixtures-applib</artifactId>
</dependency>


<!-- IDE support (optional) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>


<!-- TESTING -->

<dependency>
<groupId>org.apache.causeway.testing</groupId>
<artifactId>causeway-testing-integtestsupport-applib</artifactId>
<scope>test</scope>
</dependency>

</dependencies>


</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package net.savantly.nexus.agents;

import org.apache.causeway.persistence.jpa.applib.CausewayModulePersistenceJpaApplib;
import org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript;
import org.apache.causeway.testing.fixtures.applib.modules.ModuleWithFixtures;
import org.apache.causeway.testing.fixtures.applib.teardown.jpa.TeardownFixtureJpaAbstract;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import dev.langchain4j.service.AiServices;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.savantly.ai.languagetools.LanguageToolModel;
import net.savantly.nexus.agents.dom.generator.PersonaGenerator;

@Configuration
@Import({
CausewayModulePersistenceJpaApplib.class,
})
@ComponentScan
@EnableJpaRepositories
@Slf4j
@EntityScan(basePackageClasses = { AgentsModule.class })
@RequiredArgsConstructor
@DependsOn("aiConfig")
public class AgentsModule implements ModuleWithFixtures {

public static final String NAMESPACE = "nexus.agents";
public static final String SCHEMA = "agents";

@Override
public FixtureScript getTeardownFixture() {
return new TeardownFixtureJpaAbstract() {
@Override
protected void execute(ExecutionContext executionContext) {
// deleteFrom(FranchiseLocation.class);
}
};
}

@Bean
@Primary
@ConditionalOnProperty("langchain4j.open-ai.chat-model.api-key")
public PersonaGenerator personaGenerator(LanguageToolModel model) {
log.info("Creating persona generator with model: {}", model);
return AiServices.builder(PersonaGenerator.class)
.chatLanguageModel(model.asChatLanguageModel())
.build();
}

@Bean
@ConditionalOnMissingBean
public PersonaGenerator defaultPersonaGenerator() {
log.info("Creating default persona generator");
return new PersonaGenerator() {
};
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package net.savantly.nexus.agents.dom.generator;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import net.savantly.nexus.agents.dom.persona.PersonaDTO;

public interface PersonaGenerator {

@SystemMessage("Generate a persona based on the provided context. The first name should start with the letter {{firstNameLetter}}.")
@UserMessage("Context: {{context}}")
default PersonaDTO generatePersona(@V("context") String context, @V("firstNameLetter") String firstNameLetter){
return new PersonaDTO().setName("Generated Persona").setDescription(context);
}


}
Original file line number Diff line number Diff line change
@@ -1,19 +1,7 @@
package net.savantly.nexus.projects.dom.organizationPersona;
package net.savantly.nexus.agents.dom.organizationPersona;

import java.util.Comparator;

import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Transient;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.apache.causeway.applib.annotation.DomainObject;
import org.apache.causeway.applib.annotation.DomainObjectLayout;
import org.apache.causeway.applib.annotation.Editing;
Expand All @@ -27,19 +15,30 @@
import org.apache.causeway.applib.services.title.TitleService;
import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;

import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Transient;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.val;
import net.savantly.nexus.agents.AgentsModule;
import net.savantly.nexus.agents.dom.persona.Persona;
import net.savantly.nexus.organizations.dom.organization.Organization;
import net.savantly.nexus.projects.ProjectsModule;
import net.savantly.nexus.projects.dom.persona.Persona;

@Named(ProjectsModule.NAMESPACE + ".OrganizationPersona")
@Named(AgentsModule.NAMESPACE + ".OrganizationPersona")
@jakarta.persistence.Entity
@jakarta.persistence.Table(name = "org_persona", schema = ProjectsModule.SCHEMA)
@jakarta.persistence.Table(name = "org_persona", schema = AgentsModule.SCHEMA)
@jakarta.persistence.EntityListeners(CausewayEntityListener.class)
@DomainObject(entityChangePublishing = Publishing.ENABLED, editing = Editing.ENABLED)
@DomainObjectLayout(cssClassFa = "circle-user")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.savantly.nexus.projects.dom.organizationPersona;
package net.savantly.nexus.agents.dom.organizationPersona;

import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.savantly.nexus.projects.dom.organizationPersona;
package net.savantly.nexus.agents.dom.organizationPersona;

import java.util.UUID;

Expand All @@ -13,10 +13,10 @@
import org.apache.causeway.applib.services.repository.RepositoryService;
import org.apache.commons.lang3.RandomStringUtils;

import net.savantly.nexus.agents.dom.generator.PersonaGenerator;
import net.savantly.nexus.agents.dom.persona.Persona;
import net.savantly.nexus.agents.dom.persona.PersonaDTO;
import net.savantly.nexus.organizations.dom.organization.Organization;
import net.savantly.nexus.projects.dom.generator.PersonaGenerator;
import net.savantly.nexus.projects.dom.persona.Persona;
import net.savantly.nexus.projects.dom.persona.PersonaDTO;

@Action
@jakarta.annotation.Priority(PriorityPrecedence.EARLY)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.savantly.nexus.projects.dom.organizationPersona;
package net.savantly.nexus.agents.dom.organizationPersona;

import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,8 @@
package net.savantly.nexus.projects.dom.persona;
package net.savantly.nexus.agents.dom.persona;

import java.util.Comparator;
import java.util.UUID;

import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.persistence.Column;
import jakarta.persistence.Id;
import jakarta.persistence.Transient;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.apache.causeway.applib.annotation.Bounding;
import org.apache.causeway.applib.annotation.DomainObject;
import org.apache.causeway.applib.annotation.DomainObjectLayout;
Expand All @@ -24,19 +17,25 @@
import org.apache.causeway.applib.services.title.TitleService;
import org.apache.causeway.persistence.jpa.applib.integration.CausewayEntityListener;

import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.persistence.Column;
import jakarta.persistence.Id;
import jakarta.persistence.Transient;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.val;
import net.savantly.ai.languagetools.HasPrompt;
import net.savantly.nexus.agents.AgentsModule;
import net.savantly.nexus.common.types.Name;
import net.savantly.nexus.projects.ProjectsModule;

@Named(ProjectsModule.NAMESPACE + ".Persona")
@Named(AgentsModule.NAMESPACE + ".Persona")
@jakarta.persistence.Entity
@jakarta.persistence.Table(schema = ProjectsModule.SCHEMA, name = "persona")
@jakarta.persistence.Table(schema = AgentsModule.SCHEMA, name = "persona")
@jakarta.persistence.EntityListeners(CausewayEntityListener.class)
@DomainObject(entityChangePublishing = Publishing.ENABLED, editing = Editing.ENABLED, bounding = Bounding.BOUNDED)
@DomainObjectLayout(cssClassFa = "user")
Expand Down Expand Up @@ -125,6 +124,12 @@ private static String idGenerator(String name) {
@PropertyLayout(fieldSetId = "name", sequence = "1")
private String name;

@Property(editing = Editing.DISABLED)
@PropertyLayout(fieldSetId = "name", sequence = "1")
@Getter @Setter
@ToString.Include
private boolean retired;

/****************
* DESCRIPTION *
****************/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.savantly.nexus.projects.dom.persona;
package net.savantly.nexus.agents.dom.persona;

import java.io.Serializable;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.savantly.nexus.projects.dom.persona;
package net.savantly.nexus.agents.dom.persona;

import java.util.Collection;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.savantly.nexus.projects.dom.persona;
package net.savantly.nexus.agents.dom.persona;

import jakarta.inject.Inject;

Expand All @@ -15,12 +15,12 @@
@Action(semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE, commandPublishing = Publishing.ENABLED, executionPublishing = Publishing.ENABLED)
@ActionLayout(describedAs = "Deletes the persona permanently")
@lombok.RequiredArgsConstructor(onConstructor_ = { @Inject })
public class Persona_delete {
public class Persona_retire {

final Persona persona;

public static class ActionEvent
extends org.apache.causeway.applib.CausewayModuleApplib.ActionDomainEvent<Persona_delete> {
extends org.apache.causeway.applib.CausewayModuleApplib.ActionDomainEvent<Persona_retire> {
}

@Inject
Expand All @@ -32,7 +32,6 @@ public static class ActionEvent

@MemberSupport
public void act() {

final String title = titleService.titleOf(persona);
messageService.informUser(String.format("'%s' deleted", title));
userRepository.delete(persona);
Expand Down
Loading

0 comments on commit a18240d

Please sign in to comment.