1616package com.embabel.decker
1717
1818import com.embabel.agent.api.annotation.*
19+ import com.embabel.agent.api.common.Ai
1920import com.embabel.agent.api.common.OperationContext
2021import com.embabel.agent.api.common.create
2122import com.embabel.agent.api.dsl.parallelMap
22- import com.embabel.agent.config.models.AnthropicModels
23- import com.embabel.agent.config.models.OpenAiModels
24- import com.embabel.agent.core.CoreToolGroups
2523import com.embabel.agent.domain.io.FileArtifact
2624import com.embabel.agent.domain.library.ResearchReport
2725import com.embabel.agent.domain.library.ResearchTopics
26+ import com.embabel.agent.prompt.persona.Actor
2827import com.embabel.agent.prompt.persona.CoStar
29- import com.embabel.agent.tools.file.DefaultFileReadLog
30- import com.embabel.agent.tools.file.FileReadLog
31- import com.embabel.agent.tools.file.FileReadTools
32- import com.embabel.agent.tools.file.WellKnownFileContentTransformers.removeApacheLicenseHeader
33- import com.embabel.common.ai.model.LlmOptions
34- import com.embabel.common.ai.model.ModelSelectionCriteria.Companion.byName
28+ import com.embabel.agent.prompt.persona.RoleGoalBackstory
3529import com.embabel.common.ai.prompt.PromptContributor
36- import com.embabel.common.util.StringTransformer
3730import com.fasterxml.jackson.annotation.JsonIgnore
3831import org.slf4j.LoggerFactory
3932import org.springframework.boot.context.properties.ConfigurationProperties
33+ import org.springframework.boot.context.properties.NestedConfigurationProperty
34+ import org.springframework.validation.annotation.Validated
4035
4136data class ImageInfo (val url : String , val useWhen : String )
4237
@@ -81,40 +76,37 @@ data class PresentationRequest(
8176 }
8277}
8378
84- @ConfigurationProperties(prefix = " embabel.presentation-maker" )
85- data class PresentationMakerProperties (
86- val researchModel : String = OpenAiModels .GPT_41_MINI ,
87- val creationModel : String = AnthropicModels .CLAUDE_37_SONNET ,
88- ) {
89-
90- val researchLlm =
91- LlmOptions (byName(researchModel))
92-
93- val creationLlm =
94- LlmOptions (byName(creationModel))
95- }
79+ @Validated
80+ @ConfigurationProperties(prefix = " decker" )
81+ data class DeckerConfig (
82+ @NestedConfigurationProperty val planner : Actor <RoleGoalBackstory >,
83+ @NestedConfigurationProperty val researcher : Actor <RoleGoalBackstory >,
84+ @NestedConfigurationProperty val creator : Actor <RoleGoalBackstory >,
85+ )
9686
9787
9888/* *
99- * Naming agent that generates names for a company or project .
89+ * Agent that generates slide decks .
10090 */
10191@Agent(description = " Presentation maker. Build a presentation on a topic" )
102- class PresentationMaker (
92+ class Decker (
10393 private val slideFormatter : SlideFormatter ,
10494 private val filePersister : FilePersister ,
105- private val properties : PresentationMakerProperties ,
95+ private val config : DeckerConfig ,
10696) {
10797
108- private val logger = LoggerFactory .getLogger(PresentationMaker ::class .java)
98+ private val logger = LoggerFactory .getLogger(Decker ::class .java)
99+
100+ init {
101+ logger.info(" Decker initialized with config: {}" , config)
102+ }
109103
110104 @Action
111105 fun identifyResearchTopics (
112106 presentationRequest : PresentationRequest ,
113- context : OperationContext
107+ ai : Ai
114108 ): ResearchTopics =
115- context.ai()
116- .withLlm(properties.creationLlm)
117- // toolGroups = setOf(CoreToolGroups.WEB),
109+ config.creator.promptRunner(ai)
118110 .create(
119111 """
120112 Create a list of research topics for a presentation,
@@ -131,9 +123,7 @@ class PresentationMaker(
131123 context : OperationContext ,
132124 ): ResearchResult {
133125 val topicReports = researchTopics.topics.parallelMap(context) {
134- context.ai()
135- .withLlm(llm = properties.researchLlm)
136- .withToolGroup(CoreToolGroups .WEB )
126+ config.researcher.promptRunner(context)
137127 .withToolObject(presentationRequest.project)
138128 .withPromptContributor(presentationRequest)
139129 .create<ResearchReport >(
@@ -158,11 +148,10 @@ class PresentationMaker(
158148 fun createDeck (
159149 presentationRequest : PresentationRequest ,
160150 researchComplete : ResearchResult ,
161- context : OperationContext ,
151+ ai : Ai ,
162152 ): SlideDeck {
163- val slideDeck = context. promptRunner(llm = properties.creationLlm )
153+ val slideDeck = config.creator. promptRunner(ai )
164154 .withPromptContributor(presentationRequest)
165- .withToolGroup(CoreToolGroups .WEB )
166155 .withToolObject(presentationRequest.project)
167156 .create<SlideDeck >(
168157 """
@@ -253,9 +242,9 @@ class PresentationMaker(
253242 } else {
254243 logger.info(" Asking LLM to add illustrations to this resource" )
255244
256- val illustrator = context.promptRunner (
257- llm = properties.researchLlm .withTemperature(.3 )
258- ).withToolGroup( CoreToolGroups . WEB )
245+ val illustrator = context.ai().withLlm (
246+ config.researcher.llm .withTemperature(.3 )
247+ )
259248 val newSlides = withDiagrams.slides().map { slide ->
260249 val newContent = illustrator.generateText(
261250 """
@@ -323,9 +312,3 @@ class PresentationMaker(
323312 }
324313
325314}
326-
327- class Project (override val root : String ) : FileReadTools, SymbolSearch,
328- FileReadLog by DefaultFileReadLog () {
329-
330- override val fileContentTransformers: List <StringTransformer > = listOf (removeApacheLicenseHeader)
331- }
0 commit comments