Source code for prompt_recipe_smith.session

from __future__ import annotations

from dataclasses import dataclass

from prompt_recipe_smith.builder import PromptBuilder
from prompt_recipe_smith.models import (
    PromptQuestion,
    PromptRecipe,
    PromptResult,
    PromptSession,
)


[docs] @dataclass class PromptSessionRunner: """Runs one prompt-building session.""" recipe: PromptRecipe builder: PromptBuilder
[docs] def run(self, user_input: str) -> PromptResult: return self.builder.build(self.recipe, user_input)
[docs] def start(self, user_input: str) -> PromptSession: selected_branch = self.builder._select_branch(self.recipe, user_input) return PromptSession( recipe_name=self.recipe.name, user_input=user_input, selected_branch=selected_branch.name if selected_branch else None, next_question=self._question_at(0), complete=len(self.recipe.questions) == 0, )
[docs] def answer(self, session: PromptSession, answer: str) -> PromptSession: if session.complete: return session next_question = session.next_question if next_question is None: return PromptSession( recipe_name=session.recipe_name, user_input=session.user_input, selected_branch=session.selected_branch, answers=session.answers, complete=True, ) answers = (*session.answers, (next_question.key, answer)) return PromptSession( recipe_name=session.recipe_name, user_input=session.user_input, selected_branch=session.selected_branch, answers=answers, next_question=self._question_at(len(answers)), complete=len(answers) >= len(self.recipe.questions), )
[docs] def finish(self, session: PromptSession) -> PromptResult: return self.builder.build_layered( self.recipe, session.user_input, dict(session.answers), )
[docs] def session_for(self, result: PromptResult) -> PromptSession: return PromptSession( recipe_name=result.recipe_name, user_input=result.user_input, selected_branch=result.selected_branch, answers=result.answers, complete=True, )
def _question_at(self, index: int) -> PromptQuestion | None: if index >= len(self.recipe.questions): return None return self.recipe.questions[index]