Commit Graph

5 Commits

Author SHA1 Message Date
Praxis CI be3df525d8 feat(P01-03-01,P01-03-02): Pydantic scenario schema + refund YAML
server/scenarios/schema.py defines the typed model: Scenario (id, path,
market, language, title, difficulty, failure_mode, persona, setup,
success_criteria, common_mistakes, branches[], debrief) + Branch (id,
trigger.learner_signals, outcome, failure_mode, debrief_focus) +
ScenarioDebrief (model=deepseek-v4-flash:cloud, mode=no_think, D-020).
failure_mode field present per D-009. server/scenarios/loader.py loads
YAML → Pydantic, validates at load time, raises typed ValidationError on
bad input.

scenarios/customer_service_refund_ca_v01.yaml — the v0.1 Canada Customer
Service scenario (D-010): 'Angry customer requesting refund on a damaged
product', one branch point (accept_resolution vs escalate),
failure_mode=escalates_unresolved, success criteria, common mistakes,
debrief config. Matches the RESEARCH.md example.

5 unit tests pass (valid parse, invalid raises typed error, branch
outcome Literal, branch_by_id, real YAML load). load() returns a valid
Scenario with both branches.

---ci---
phase: 1
milestone: v0.1
plan: 03
task: 03-01,03-02
status: execute
persona: data-engineer
requirements:
  covered: [REQ-SCEN-01, REQ-SCEN-FMT-01]
---/ci---
2026-08-01 13:10:00 +00:00
Praxis CI 7b1b296430 feat(P01-02-05,P01-02-06): React client + latency readout
client/ — React + Vite + TypeScript scaffolded with the Pipecat client SDK
(@pipecat-ai/client-js) and SmallWebRTCTransport
(@pipecat-ai/small-webrtc-transport). useVoiceSession.ts hook manages mic
permission, WebRTC connect, audio playback, live transcript, and a latency
readout (captures the e2e_latency_ms metric the server emits). App.tsx is a
minimal one-page session UI: disclaimer, Start/End buttons, status badge,
latency readout (within/over 600ms budget), live transcript. vite.config.ts
proxies /pipecat + /health to the Python server (port 8789). npm run
typecheck + npm run build pass.

server/latency.py — LatencyObserver (a Pipecat FrameProcessor) timestamps
transcript-ready, LLM-first-token, TTS-first-audio, and playback-start per
turn, computes ASR→TTS-first-audio (the v0.1 latency target), and logs it
to console with a within/over-budget verdict. Wired into the pipeline
between STT/LLM/TTS so it observes without altering the frame stream. 5
unit tests pass (LatencyRecord e2e math + observer construction +
reset_turn). Full server suite: 18 passed.

---ci---
phase: 1
milestone: v0.1
plan: 02
task: 02-05,02-06
status: execute
persona: frontend-engineer,backend-engineer
requirements:
  covered: [REQ-VOICE-01, REQ-VOICE-02, REQ-VOICE-03, REQ-NFR-LAT-01]
---/ci---
2026-08-01 13:08:42 +00:00
Praxis CI 2a9111c58c feat(P01-02-03): OllamaCloudLLM adapter behind LLMProvider (R6)
server/llm/ollama_cloud.py wraps the Ollama Cloud direct API
(https://ollama.com/api/chat + bearer, stream=True) behind LLMProvider.
chat() streams LLMStreamChunk (is_first flag for TTFT measurement);
chat_full() accumulates for the debrief / branch classifier (offline).
Two models: gemma4:cloud (roleplay_model) + deepseek-v4-flash:cloud
(debrief_model, no_think mode for latency, D-020). Resolves R6 — the
adapter confirms the direct API + bearer path; a live first-token
confirmation is pending the R3 probe with a real key. Graceful no-key
degradation (no chunks, no crash). 6 unit tests pass (mocked httpx
streaming response + env model selection + chat_full accumulation).

---ci---
phase: 1
milestone: v0.1
plan: 02
task: 02-03
status: execute
persona: backend-engineer
requirements:
  covered: [REQ-LLM-01, REQ-LLM-02]
---/ci---
2026-08-01 13:01:37 +00:00
Praxis CI f0afc8ef57 feat(P01-02-02): Cartesia + Piper TTS adapters behind TTSProvider
server/tts/cartesia_tts.py wraps the raw Cartesia Sonic WebSocket API
(wss://api.cartesia.ai/tts/websocket) — streaming PCM s16le, one voice
(CARTESIA_VOICE_ID, D-006). server/tts/piper_tts.py wraps piper-tts
self-hosted synthesis (R4 mitigation, open-weights). Both implement
TTSProvider (synthesize streaming + synthesize_all). Both degrade
gracefully (no audio, no crash) when the API key / voice model is absent.
PRAXIS_TTS=cartesia|piper selects the adapter via the registry with no
pipeline change (D-014). 7 unit tests pass (mock streams + env selection
+ graceful missing-key/model handling).

---ci---
phase: 1
milestone: v0.1
plan: 02
task: 02-02
status: execute
persona: backend-engineer
requirements:
  covered: [REQ-VOICE-02]
---/ci---
2026-08-01 13:00:54 +00:00
Praxis CI ea1b77535e feat(P01-01-01): create repo skeleton for v0.1 minimal voice loop
server/, client/, scenarios/, db/, scripts/, tests/, docs/ dirs match
PERSONAS.md territory. pyproject.toml declares pipecat-ai[deepgram,cartesia,piper,webrtc]
+ openai + pydantic + pyyaml + aiosqlite + httpx + websockets. .env.example
documents DEEPGRAM_API_KEY, CARTESIA_API_KEY, OLLAMA_API_KEY and the TTS
selection (PRAXIS_TTS=cartesia|piper). Verified: python -c 'import pipecat'
succeeds (pipecat-ai 1.6.0 installed).

---ci---
phase: 1
milestone: v0.1
plan: 01
task: 01-01
status: execute
persona: lead-developer
requirements:
  covered: [REQ-ORCH-01]
---/ci---
2026-08-01 12:54:56 +00:00