88a1dab810
---ci--- phase: 7 milestone: v0.2 status: complete requirements: covered: [REQ-2-001, REQ-2-002, REQ-2-003, REQ-2-004, REQ-2-005, REQ-2-006, REQ-2-007, REQ-2-008, REQ-2-009, REQ-2-010, REQ-2-011, REQ-2-012] partial: [] ---/ci--- Milestone v0.2 (ai-tutor-architecture) merged to main. Escalation record (audit remediation, durable): P1 executor delegation failed twice (empty subagent results, zero files created); auto-resolved at full autonomy to inline execution with identical plan fidelity (commit 3271373, reflog-only after phase branch squash-delete).
38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
"""LabAgent — in-flow feedback over simulated sandbox telemetry (REQ-2-007).
|
|
|
|
Scenario-driven: consumes a LabTelemetryScenario from the corpus, renders
|
|
the event timeline into the conversation, streams concrete feedback.
|
|
No session chat — each request is one scenario read.
|
|
"""
|
|
|
|
from collections.abc import AsyncIterator
|
|
|
|
from ..config import Settings
|
|
from ..corpus.learner_context import LearnerContext, get_learner_context
|
|
from ..corpus.telemetry import LabTelemetryScenario, summarize_scenario
|
|
from ..llm.base import LLMProvider
|
|
from ..prompts.lab import SYSTEM_PROMPT, render_context
|
|
from .base import BaseAgent
|
|
|
|
|
|
class LabAgent(BaseAgent):
|
|
name = "lab"
|
|
|
|
def __init__(self, provider: LLMProvider, settings: Settings) -> None:
|
|
super().__init__(provider, settings)
|
|
|
|
def system_prompt(self, learner_context: LearnerContext | None = None) -> str:
|
|
ctx = learner_context or get_learner_context()
|
|
return SYSTEM_PROMPT.format_map(render_context(ctx))
|
|
|
|
async def stream_feedback(
|
|
self,
|
|
scenario: LabTelemetryScenario,
|
|
learner_context: LearnerContext | None = None,
|
|
) -> AsyncIterator[str]:
|
|
timeline = summarize_scenario(scenario)
|
|
async for token in self.stream_reply(
|
|
history=None, user_input=timeline, learner_context=learner_context
|
|
):
|
|
yield token
|