Skip to content

lasagnastack.stages.optimize_skill_pipeline.optimize_skill

lasagnastack.stages.optimize_skill_pipeline.optimize_skill

Stage 2 of the optimize-skill pipeline: generate an improved skill file.

OptimizeSkillStage

OptimizeSkillStage(client: LLMClient | None = None)

Bases: Stage

Generate an improved skill file from the parsed training examples.

Source code in src/lasagnastack/stages/optimize_skill_pipeline/optimize_skill.py
def __init__(self, client: LLMClient | None = None) -> None:
    self._client = client

run

Run the optimization LLM call and store the result in state.

Parameters:

Name Type Description Default
state PipelineState

Pipeline state with draft_cut_lists and draft_reel_style_sheets.

required

Returns:

Type Description
PipelineState

Updated state with optimized_skill_text set.

Source code in src/lasagnastack/stages/optimize_skill_pipeline/optimize_skill.py
def run(self, state: PipelineState) -> PipelineState:
    """Run the optimization LLM call and store the result in state.

    Args:
        state: Pipeline state with ``draft_cut_lists`` and ``draft_reel_style_sheets``.

    Returns:
        Updated state with ``optimized_skill_text`` set.
    """
    assert isinstance(state, OptimizeSkillPipelineState)
    skill_text = run(state, client=self._client)
    return dataclasses.replace(state, optimized_skill_text=skill_text)

run

run(
    state: OptimizeSkillPipelineState,
    client: LLMClient | None = None,
) -> str

Call the LLM with the existing skill + few-shot examples → improved skill text.

Parameters:

Name Type Description Default
state OptimizeSkillPipelineState

Pipeline state. draft_cut_lists, draft_reel_style_sheets, and skill_path must all be set.

required
client LLMClient | None

LLM client to use. Defaults to GeminiClient.

None

Returns:

Type Description
str

The full text of the improved skill Markdown file.

Source code in src/lasagnastack/stages/optimize_skill_pipeline/optimize_skill.py
def run(
    state: OptimizeSkillPipelineState,
    client: LLMClient | None = None,
) -> str:
    """Call the LLM with the existing skill + few-shot examples → improved skill text.

    Args:
        state: Pipeline state. ``draft_cut_lists``, ``draft_reel_style_sheets``,
            and ``skill_path`` must all be set.
        client: LLM client to use. Defaults to ``GeminiClient``.

    Returns:
        The full text of the improved skill Markdown file.
    """
    if client is None:
        client = GeminiClient()

    assert state.draft_cut_lists is not None
    assert state.draft_reel_style_sheets is not None

    existing_skill = (
        state.skill_path.read_text(encoding="utf-8").strip()
        if state.skill_path and state.skill_path.exists()
        else "(no existing skill — generate from scratch)"
    )

    examples = _format_examples(state)
    prompt = _build_prompt(existing_skill, examples)

    log.info("optimize_skill_start", drafts=len(state.draft_cut_lists))
    result: OptimizedSkill = client.generate(prompt, OptimizedSkill, temperature=0.4)
    log.info("optimize_skill_done", chars=len(result.skill_text))
    return result.skill_text