REPL when skill_create needs user input

This commit is contained in:
Denton Social
2026-09-24 05:46:23 -05:00
parent e92b3e7228
commit 63922c1fad
15 changed files with 545 additions and 16 deletions
+61 -2
View File
@@ -24,6 +24,8 @@ class RunResult:
updated_request: str | None = None
decisions_logged: int = 0
error: str | None = None
needs_input: str | None = None
prediction: Prediction | None = None
class SkillRunner:
@@ -37,8 +39,6 @@ class SkillRunner:
try:
prediction = skill.predict(self.ctx, request) if skill.predict else Prediction(text="")
action = skill.act(self.ctx, request, prediction)
observed = action.new_state
assessment: Assessment = self.llm.assess(skill.name, baseline, action.action_log)
except Exception as exc:
return RunResult(
skill=skill.name,
@@ -48,6 +48,64 @@ class SkillRunner:
new_state=baseline,
error=str(exc),
)
if action.needs_input:
return RunResult(
skill=skill.name,
success=False,
summary="",
action_log=action.action_log,
new_state=baseline,
needs_input=action.needs_input,
prediction=prediction,
)
return self._finish(skill, request, prediction, action)
def resume(self, skill: Skill, request: Request, prediction: Prediction) -> RunResult:
"""Re-invoke act with the human's answer (on request.user_input) and finish.
predict is not re-run: its SemIf sub-decisions were already made and are
logged here, at completion, so their run_ok label reflects the outcome.
"""
baseline = request.text
try:
action = skill.act(self.ctx, request, prediction)
except Exception as exc:
return RunResult(
skill=skill.name,
success=False,
summary="",
action_log="",
new_state=baseline,
error=str(exc),
)
if action.needs_input:
return RunResult(
skill=skill.name,
success=False,
summary="",
action_log=action.action_log,
new_state=baseline,
needs_input=action.needs_input,
prediction=prediction,
)
return self._finish(skill, request, prediction, action)
def _finish(
self, skill: Skill, request: Request, prediction: Prediction, action
) -> RunResult:
baseline = request.text
observed = action.new_state
try:
assessment: Assessment = self.llm.assess(skill.name, baseline, action.action_log)
except Exception as exc:
return RunResult(
skill=skill.name,
success=False,
summary="",
action_log="",
new_state=observed,
error=str(exc),
)
run_ok = assessment.success
decisions = getattr(prediction, "decisions", [])
@@ -71,4 +129,5 @@ class SkillRunner:
new_state=observed,
updated_request=assessment.updated_request,
decisions_logged=len(decisions),
prediction=prediction,
)