Skip to content

Commit dc6052c

Browse files
committed
Workflow API polishing
1 parent c1f1e70 commit dc6052c

File tree

6 files changed

+77
-43
lines changed

6 files changed

+77
-43
lines changed

embabel-agent-api/src/main/kotlin/com/embabel/agent/api/common/workflow/WorkflowBuilder.kt

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,15 @@ interface WorkflowBuilderReturning {
2929
fun <RESULT : Any> returning(resultClass: Class<RESULT>): Any
3030
}
3131

32-
interface WorkflowBuilderWithInput {
33-
34-
/**
35-
* Specify an input class for this workflow agent.
36-
*/
37-
fun withInput(inputClass: Class<out Any>): Any
38-
}
39-
4032
/**
4133
* Ensure consistent naming convention for workflow builders that consume a given input type.
4234
*/
43-
interface WorkFlowBuilderConsuming {
35+
interface WorkflowBuilderConsuming {
4436

37+
/**
38+
* Specify the input type for this workflow.
39+
* Return a builder
40+
*/
4541
fun <INPUT : Any> consuming(inputClass: Class<INPUT>): Any
4642
}
4743

embabel-agent-api/src/main/kotlin/com/embabel/agent/api/common/workflow/control/SimpleAgentBuilder.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@ import com.embabel.agent.api.common.SupplierActionContext
1919
import com.embabel.agent.api.common.TransformationActionContext
2020
import com.embabel.agent.api.common.support.SupplierAction
2121
import com.embabel.agent.api.common.support.TransformationAction
22-
import com.embabel.agent.api.common.workflow.WorkFlowBuilderConsuming
2322
import com.embabel.agent.api.common.workflow.WorkflowBuilder
23+
import com.embabel.agent.api.common.workflow.WorkflowBuilderConsuming
2424
import com.embabel.agent.api.common.workflow.WorkflowBuilderReturning
25-
import com.embabel.agent.api.common.workflow.WorkflowBuilderWithInput
2625
import com.embabel.agent.api.dsl.AgentScopeBuilder
2726
import com.embabel.agent.core.Goal
2827
import com.embabel.agent.core.IoBinding
@@ -35,7 +34,7 @@ import com.embabel.common.core.MobyNameGenerator
3534
data class SimpleAgentBuilder<RESULT : Any>(
3635
private val resultClass: Class<RESULT>,
3736
private val inputClass: Class<out Any>? = null,
38-
) : WorkFlowBuilderConsuming, WorkflowBuilderWithInput {
37+
) : WorkflowBuilderConsuming {
3938

4039
companion object : WorkflowBuilderReturning {
4140

@@ -53,16 +52,13 @@ data class SimpleAgentBuilder<RESULT : Any>(
5352
}
5453
}
5554

56-
override fun withInput(inputClass: Class<out Any>): SimpleAgentBuilder<RESULT> {
57-
return copy(inputClass = inputClass)
58-
}
59-
6055
override fun <INPUT : Any> consuming(inputClass: Class<INPUT>): SimpleAgentConsumer<INPUT> {
6156
return SimpleAgentConsumer(inputClass)
6257
}
6358

6459
/**
65-
* Provide a function the agent will perform.
60+
* Provide a function the agent will perform to generate
61+
* a draft on each iteration
6662
*/
6763
fun running(
6864
generator: (SupplierActionContext<RESULT>) -> RESULT,

embabel-agent-api/src/main/kotlin/com/embabel/agent/api/common/workflow/loop/Feedback.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,19 @@
1616
package com.embabel.agent.api.common.workflow.loop
1717

1818
import com.embabel.common.core.types.ZeroToOne
19+
import com.fasterxml.jackson.annotation.JsonPropertyDescription
1920

21+
/**
22+
* Feedback on a generated output
23+
*/
2024
interface Feedback {
25+
@get:JsonPropertyDescription("Feedback score between 0.0 and 1.0 where 0.0 is worst and 1.0 is best")
2126
val score: ZeroToOne
2227
}
2328

29+
/**
30+
* Convenient implementation of [Feedback] that contains textual feedback.
31+
*/
2432
data class TextFeedback(
2533
override val score: ZeroToOne,
2634
val feedback: String,

embabel-agent-api/src/main/kotlin/com/embabel/agent/api/common/workflow/loop/RepeatUntilAcceptable.kt

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ data class RepeatUntilAcceptable(
304304

305305
}
306306

307-
open class RepeatUntilAcceptableActionContext<INPUT, RESULT : Any, FEEDBACK : Feedback>(
307+
abstract class RepeatUntilContext<INPUT, RESULT : Any, FEEDBACK : Feedback>(
308308
override val input: INPUT,
309309
override val processContext: ProcessContext,
310310
override val action: Action,
@@ -314,40 +314,70 @@ open class RepeatUntilAcceptableActionContext<INPUT, RESULT : Any, FEEDBACK : Fe
314314
) : InputActionContext<INPUT?>, Blackboard by processContext.agentProcess,
315315
AgenticEventListener by processContext {
316316

317-
override val toolGroups: Set<ToolGroupRequirement>
318-
get() = action.toolGroups
319-
320-
override val operation = action
321-
322317
/**
323318
* Get the last attempt if available.
324319
*/
325320
fun lastAttempt(): Attempt<RESULT, FEEDBACK>? = attemptHistory.lastAttempt()
326-
}
327321

328-
open class EvaluationActionContext<INPUT, RESULT : Any, FEEDBACK : Feedback>(
329-
override val input: INPUT,
330-
override val processContext: ProcessContext,
331-
override val action: Action,
332-
val inputClass: Class<INPUT>,
333-
val outputClass: Class<*>,
334-
val attemptHistory: AttemptHistory<INPUT, RESULT, FEEDBACK>,
335-
) : InputActionContext<INPUT?>, Blackboard by processContext.agentProcess,
336-
AgenticEventListener by processContext {
322+
/**
323+
* Convenience method to get result from last attempt or return default
324+
* Easy to embed in prompts
325+
*/
326+
fun lastAttemptOr(defaultValue: String): String {
327+
return lastAttempt()?.result?.toString() ?: defaultValue
328+
}
329+
330+
/**
331+
* Convenience method to get feedback from last attempt or return default
332+
*/
333+
fun lastFeedbackOr(defaultValue: String): String {
334+
return lastAttempt()?.feedback?.toString() ?: defaultValue
335+
}
337336

338337
override val toolGroups: Set<ToolGroupRequirement>
339338
get() = action.toolGroups
340339

341340
override val operation = action
342341

342+
}
343+
344+
open class RepeatUntilAcceptableActionContext<INPUT, RESULT : Any, FEEDBACK : Feedback>(
345+
input: INPUT,
346+
processContext: ProcessContext,
347+
action: Action,
348+
inputClass: Class<INPUT>,
349+
outputClass: Class<*>,
350+
attemptHistory: AttemptHistory<INPUT, RESULT, FEEDBACK>,
351+
) : RepeatUntilContext<INPUT, RESULT, FEEDBACK>(
352+
input = input,
353+
processContext = processContext,
354+
action = action,
355+
inputClass = inputClass,
356+
outputClass = outputClass,
357+
attemptHistory = attemptHistory,
358+
)
359+
360+
361+
open class EvaluationActionContext<INPUT, RESULT : Any, FEEDBACK : Feedback>(
362+
input: INPUT,
363+
processContext: ProcessContext,
364+
action: Action,
365+
inputClass: Class<INPUT>,
366+
outputClass: Class<*>,
367+
attemptHistory: AttemptHistory<INPUT, RESULT, FEEDBACK>,
368+
) : RepeatUntilContext<INPUT, RESULT, FEEDBACK>(
369+
input = input,
370+
processContext = processContext,
371+
action = action,
372+
inputClass = inputClass,
373+
outputClass = outputClass,
374+
attemptHistory = attemptHistory,
375+
) {
343376
val resultToEvaluate: RESULT = attemptHistory.resultToEvaluate() ?: error("No result available in AttemptHistory")
344377

345-
/**
346-
* Get the last attempt if available.
347-
*/
348-
fun lastAttempt(): Attempt<RESULT, FEEDBACK>? = attemptHistory.lastAttempt()
349378
}
350379

380+
351381
data class AcceptanceActionContext<INPUT, RESULT : Any, FEEDBACK : Feedback>(
352382
val input: INPUT,
353383
val attemptHistory: AttemptHistory<INPUT, RESULT, FEEDBACK>,

embabel-agent-api/src/main/kotlin/com/embabel/agent/api/common/workflow/loop/RepeatUntilAcceptableBuilder.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,21 @@
1515
*/
1616
package com.embabel.agent.api.common.workflow.loop
1717

18-
import com.embabel.agent.api.common.workflow.WorkFlowBuilderConsuming
1918
import com.embabel.agent.api.common.workflow.WorkflowBuilder
19+
import com.embabel.agent.api.common.workflow.WorkflowBuilderConsuming
2020
import com.embabel.agent.api.common.workflow.WorkflowBuilderReturning
2121
import com.embabel.agent.api.dsl.AgentScopeBuilder
2222

2323
/**
24-
* Java friendly builder for RepeatUntil workflow.
24+
* Java friendly builder for RepeatUntilAcceptable workflow.
2525
*/
2626
data class RepeatUntilAcceptableBuilder<INPUT, RESULT : Any, FEEDBACK : Feedback>(
2727
private val resultClass: Class<RESULT>,
2828
private val inputClass: Class<out INPUT>,
2929
private val feedbackClass: Class<FEEDBACK> = Feedback::class.java as Class<FEEDBACK>,
3030
private val maxIterations: Int = DEFAULT_MAX_ITERATIONS,
3131
private val scoreThreshold: Double = DEFAULT_SCORE_THRESHOLD,
32-
) : WorkFlowBuilderConsuming {
32+
) : WorkflowBuilderConsuming {
3333

3434
companion object : WorkflowBuilderReturning {
3535

@@ -42,7 +42,11 @@ data class RepeatUntilAcceptableBuilder<INPUT, RESULT : Any, FEEDBACK : Feedback
4242
*/
4343
@JvmStatic
4444
override fun <RESULT : Any> returning(resultClass: Class<RESULT>): RepeatUntilAcceptableBuilder<Any?, RESULT, TextFeedback> {
45-
return RepeatUntilAcceptableBuilder(resultClass = resultClass, inputClass = Unit::class.java, feedbackClass = TextFeedback::class.java)
45+
return RepeatUntilAcceptableBuilder(
46+
resultClass = resultClass,
47+
inputClass = Unit::class.java,
48+
feedbackClass = TextFeedback::class.java
49+
)
4650
}
4751
}
4852

embabel-agent-api/src/main/kotlin/com/embabel/agent/api/common/workflow/loop/RepeatUntilBuilder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
*/
1616
package com.embabel.agent.api.common.workflow.loop
1717

18-
import com.embabel.agent.api.common.workflow.WorkFlowBuilderConsuming
1918
import com.embabel.agent.api.common.workflow.WorkflowBuilder
19+
import com.embabel.agent.api.common.workflow.WorkflowBuilderConsuming
2020
import com.embabel.agent.api.common.workflow.WorkflowBuilderReturning
2121
import com.embabel.agent.api.dsl.AgentScopeBuilder
2222

@@ -27,7 +27,7 @@ data class RepeatUntilBuilder<INPUT, RESULT : Any>(
2727
private val resultClass: Class<RESULT>,
2828
private val inputClass: Class<out INPUT>,
2929
private val maxIterations: Int = DEFAULT_MAX_ITERATIONS,
30-
) : WorkFlowBuilderConsuming {
30+
) : WorkflowBuilderConsuming {
3131

3232
companion object : WorkflowBuilderReturning {
3333

0 commit comments

Comments
 (0)