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).
51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
"""Coach agent tests — persona, message assembly, streaming (REQ-2-005)."""
|
|
|
|
from ai_service.agents.coach import CoachAgent
|
|
from ai_service.config import Settings
|
|
from ai_service.corpus.learner_context import get_learner_context
|
|
from ai_service.llm.mock import MockProvider
|
|
from ai_service.llm.types import Message
|
|
|
|
|
|
def make_coach() -> CoachAgent:
|
|
return CoachAgent(MockProvider(), Settings(provider="mock"))
|
|
|
|
|
|
def test_system_prompt_includes_learner_context():
|
|
coach = make_coach()
|
|
prompt = coach.system_prompt(get_learner_context())
|
|
assert "Alex Rivera" in prompt
|
|
assert "AI Orchestration Engineer (62%)" in prompt
|
|
assert "retrieval practice" in prompt.lower()
|
|
assert "one clear next action" in prompt.lower()
|
|
|
|
|
|
def test_system_prompt_marks_current_focus():
|
|
coach = make_coach()
|
|
prompt = coach.system_prompt(get_learner_context())
|
|
assert "Multi-agent communication patterns" in prompt
|
|
|
|
|
|
def test_build_messages_system_history_user():
|
|
coach = make_coach()
|
|
history = [
|
|
Message(role="user", content="earlier"),
|
|
Message(role="assistant", content="reply"),
|
|
]
|
|
messages = coach.build_messages(history, "what next?", get_learner_context())
|
|
assert messages[0].role == "system"
|
|
assert "Coach" in messages[0].content
|
|
assert [m.content for m in messages[1:]] == ["earlier", "reply", "what next?"]
|
|
|
|
|
|
async def test_stream_reply_yields_deltas():
|
|
coach = make_coach()
|
|
ctx = get_learner_context()
|
|
tokens = [t async for t in coach.stream_reply(user_input="hello", learner_context=ctx)]
|
|
assert tokens
|
|
assert all(isinstance(t, str) for t in tokens)
|
|
|
|
|
|
def test_agent_name():
|
|
assert make_coach().name == "coach"
|