fix: complete pipeline working
User interrupts still need to be tested. ref: N25B-429
This commit is contained in:
@@ -157,7 +157,7 @@ class AgentSpeakGenerator:
|
||||
|
||||
previous_goal = None
|
||||
for goal in phase.goals:
|
||||
self._process_goal(goal, phase, previous_goal)
|
||||
self._process_goal(goal, phase, previous_goal, main_goal=True)
|
||||
previous_goal = goal
|
||||
|
||||
for trigger in phase.triggers:
|
||||
@@ -192,6 +192,20 @@ class AgentSpeakGenerator:
|
||||
]
|
||||
)
|
||||
|
||||
# Notify outside world about transition
|
||||
body.append(
|
||||
AstStatement(
|
||||
StatementType.DO_ACTION,
|
||||
AstLiteral(
|
||||
"notify_transition_phase",
|
||||
[
|
||||
AstString(str(from_phase.id)),
|
||||
AstString(str(to_phase.id) if to_phase else "end"),
|
||||
],
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
self._asp.plans.append(
|
||||
AstPlan(TriggerType.ADDED_GOAL, AstLiteral("transition_phase"), context, body)
|
||||
)
|
||||
@@ -213,6 +227,11 @@ class AgentSpeakGenerator:
|
||||
def _add_default_loop(self, phase: Phase) -> None:
|
||||
actions = []
|
||||
|
||||
actions.append(
|
||||
AstStatement(
|
||||
StatementType.DO_ACTION, AstLiteral("notify_user_said", [AstVar("Message")])
|
||||
)
|
||||
)
|
||||
actions.append(AstStatement(StatementType.REMOVE_BELIEF, AstLiteral("responded_this_turn")))
|
||||
actions.append(AstStatement(StatementType.ACHIEVE_GOAL, AstLiteral("check_triggers")))
|
||||
|
||||
@@ -236,6 +255,7 @@ class AgentSpeakGenerator:
|
||||
phase: Phase,
|
||||
previous_goal: Goal | None = None,
|
||||
continues_response: bool = False,
|
||||
main_goal: bool = False,
|
||||
) -> None:
|
||||
context: list[AstExpression] = [self._astify(phase)]
|
||||
context.append(~self._astify(goal, achieved=True))
|
||||
@@ -245,6 +265,13 @@ class AgentSpeakGenerator:
|
||||
context.append(~AstLiteral("responded_this_turn"))
|
||||
|
||||
body = []
|
||||
if main_goal: # UI only needs to know about the main goals
|
||||
body.append(
|
||||
AstStatement(
|
||||
StatementType.DO_ACTION,
|
||||
AstLiteral("notify_goal_start", [AstString(self.slugify(goal))]),
|
||||
)
|
||||
)
|
||||
|
||||
subgoals = []
|
||||
for step in goal.plan.steps:
|
||||
@@ -283,11 +310,23 @@ class AgentSpeakGenerator:
|
||||
body = []
|
||||
subgoals = []
|
||||
|
||||
body.append(
|
||||
AstStatement(
|
||||
StatementType.DO_ACTION,
|
||||
AstLiteral("notify_trigger_start", [AstString(self.slugify(trigger))]),
|
||||
)
|
||||
)
|
||||
for step in trigger.plan.steps:
|
||||
body.append(self._step_to_statement(step))
|
||||
if isinstance(step, Goal):
|
||||
step.can_fail = False # triggers are continuous sequence
|
||||
subgoals.append(step)
|
||||
body.append(
|
||||
AstStatement(
|
||||
StatementType.DO_ACTION,
|
||||
AstLiteral("notify_trigger_end", [AstString(self.slugify(trigger))]),
|
||||
)
|
||||
)
|
||||
|
||||
self._asp.plans.append(
|
||||
AstPlan(
|
||||
@@ -298,6 +337,9 @@ class AgentSpeakGenerator:
|
||||
)
|
||||
)
|
||||
|
||||
# Force trigger (from UI)
|
||||
self._asp.plans.append(AstPlan(TriggerType.ADDED_GOAL, self._astify(trigger), [], body))
|
||||
|
||||
for subgoal in subgoals:
|
||||
self._process_goal(subgoal, phase, continues_response=True)
|
||||
|
||||
@@ -332,13 +374,7 @@ class AgentSpeakGenerator:
|
||||
|
||||
@_astify.register
|
||||
def _(self, sb: SemanticBelief) -> AstExpression:
|
||||
return AstLiteral(self.get_semantic_belief_slug(sb))
|
||||
|
||||
@staticmethod
|
||||
def get_semantic_belief_slug(sb: SemanticBelief) -> str:
|
||||
# If you need a method like this for other types, make a public slugify singledispatch for
|
||||
# all types.
|
||||
return f"semantic_{AgentSpeakGenerator._slugify_str(sb.name)}"
|
||||
return AstLiteral(self.slugify(sb))
|
||||
|
||||
@_astify.register
|
||||
def _(self, ib: InferredBelief) -> AstExpression:
|
||||
|
||||
Reference in New Issue
Block a user