Commit Graph

11 Commits

Author SHA1 Message Date
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 47e24dbe59 feat(P01-02-01): service interfaces — TTSProvider, LLMProvider, Guardrail
server/services/base.py defines three abstract base classes with type
annotations: TTSProvider (async synthesize/synthesize_all, voice_id), LLMProvider
(async chat/chat_full, roleplay_model, debrief_model), Guardrail (async check,
session_start_disclaimer). GuardrailVerdict/Context/TTSResult/LLMStreamChunk
dataclasses carry typed metadata. server/services/registry.py resolves the
active adapter from env (PRAXIS_TTS, PRAXIS_GUARDRAIL) so the pipeline never
imports a concrete adapter directly — D-014/D-019/D-020 swap wiring. Verified:
'from server.services import TTSProvider, LLMProvider, Guardrail' succeeds.

---ci---
phase: 1
milestone: v0.1
plan: 02
task: 02-01
status: execute
persona: backend-engineer
requirements:
  covered: [REQ-VOICE-02, REQ-LLM-01, REQ-ORCH-02]
---/ci---
2026-08-01 13:00:00 +00:00
Praxis CI 80f070c60d feat(P01-01-06): latency report — R1-R4 spike documentation
docs/latency-report.md documents the SLICE-01 spike status: probe
infrastructure is built and ready; live measurements are pending API key
provisioning (only GITEA_TOKEN exists at EXECUTE time). Includes the latency
budget, the TTS decision matrix (Cartesia vs Piper, pending live R4 numbers),
the SLICE-01 go/no-go gate no-go actions per G-003, Piper pre-staging
instructions, and the R6 resolution (Pipecat OLLamaLLMService accepts custom
base_url + bearer). TTS decision recorded as 'pending live measurement —
Piper pre-staged as R4 mitigation per ARCHITECTURE.md'.

---ci---
phase: 1
milestone: v0.1
plan: 01
task: 01-06
status: execute
persona: lead-developer
requirements:
  covered: [REQ-VOICE-03, REQ-NFR-LAT-01, REQ-LLM-01, REQ-LLM-02]
---/ci---
2026-08-01 12:57:24 +00:00
Praxis CI 8ea0a2746f feat(P01-01-05): R4 probe — integrated three-hop e2e latency
scripts/probe_e2e.py runs the integrated path: ASR-transcript-in → Ollama
gemma4:cloud streaming → Cartesia TTS streaming; measures end-to-end
(transcript-in → first-audio-out) over N iterations (default 10). Prints
per-segment (LLM TTFT, TTS first-audio) + e2e summaries, and a budget
comparison vs the 600ms target. The Piper leg is optional (--piper) and
documents the pre-staged R4 mitigation if the voice model isn't provisioned.
If keys are missing, prints KEY_MISSING and exits 0.

---ci---
phase: 1
milestone: v0.1
plan: 01
task: 01-05
status: execute
persona: backend-engineer
requirements:
  covered: [REQ-VOICE-03, REQ-NFR-LAT-01, REQ-LLM-01, REQ-LLM-02]
---/ci---
2026-08-01 12:56:54 +00:00
Praxis CI a9d10656fa feat(P01-01-04): R3 probe — Ollama Cloud direct-API TTFT
scripts/probe_ollama.py calls https://ollama.com/api/chat with bearer auth,
stream=True, for gemma4:cloud (role-play) and deepseek-v4-flash:cloud
(no_think mode, D-020). Measures time-to-first-token over N iterations
(default 20), prints min/median/p95/mean tables for both models, and logs
any error/throttle events (R5). Also resolves R6 — a successful probe
confirms the direct API + bearer token path works. If OLLAMA_API_KEY is
missing, prints KEY_MISSING and exits 0.

---ci---
phase: 1
milestone: v0.1
plan: 01
task: 01-04
status: execute
persona: backend-engineer
requirements:
  covered: [REQ-LLM-01, REQ-LLM-02, REQ-VOICE-03, REQ-NFR-LAT-01]
---/ci---
2026-08-01 12:56:22 +00:00
Praxis CI b8e6bc83c5 feat(P01-01-03): R2 probe — Cartesia Sonic first-audio latency
scripts/probe_cartesia.py opens a WebSocket to Cartesia Sonic, requests TTS
for a sample customer-service utterance, and measures first-audio-byte
latency over N iterations (default 20). Prints min/median/p95/mean. Uses the
raw Cartesia WS API (no SDK coupling). If CARTESIA_API_KEY is missing, prints
KEY_MISSING and exits 0. Also fixes the R1 Deepgram probe to use the raw WS
API instead of the churn-prone SDK listen client.

---ci---
phase: 1
milestone: v0.1
plan: 01
task: 01-03
status: execute
persona: backend-engineer
requirements:
  covered: [REQ-VOICE-03, REQ-NFR-LAT-01]
---/ci---
2026-08-01 12:56:03 +00:00
Praxis CI bc7685b94f feat(P01-01-02): R1 probe — Deepgram Nova-3 first-partial latency
scripts/probe_deepgram.py opens a streaming WebSocket to Deepgram Nova-3,
sends synthesized 16kHz mono PCM in 100ms chunks, and measures
first-partial-transcript latency over N iterations (default 20). Prints
min/median/p95/mean. If DEEPGRAM_API_KEY is missing, prints a clear
KEY_MISSING banner and exits 0 — the probe infrastructure is the deliverable;
live numbers come when keys are provisioned.

---ci---
phase: 1
milestone: v0.1
plan: 01
task: 01-02
status: execute
persona: backend-engineer
requirements:
  covered: [REQ-VOICE-03, REQ-NFR-LAT-01]
---/ci---
2026-08-01 12:55:19 +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
Praxis CI 415c8ac8a6 docs(P00): phase 0 complete — v0.0.0 tagged, release pending
---ci---
phase: 0
milestone: v0.1
status: complete
escalation:
  resolution: auto
  type: release_pending
  reason: Gitea repo coreci/praxis does not exist (HTTP 404); tag+merge succeeded; release retries at milestone ship
---/ci---
2026-08-01 12:50:11 +00:00
Praxis CI 48cbd4a2b3 docs(P00): complete pre-execution phase
---ci---
phase: 0
milestone: v0.1
status: complete
requirements:
  covered: [REQ-VOICE-01, REQ-VOICE-02, REQ-VOICE-03, REQ-VOICE-04, REQ-SCEN-01, REQ-STATE-01, REQ-LLM-01, REQ-LLM-02, REQ-DEBRIEF-01, REQ-ORCH-01, REQ-ORCH-02, REQ-SCEN-FMT-01, REQ-NFR-LAT-01, REQ-NFR-SAFE-01, REQ-NFR-COST-01]
  partial: []
---/ci---
v0.0.0
2026-08-01 12:49:34 +00:00
Praxis CI bcb0118034 chore: seed .gitignore for env secrets 2026-08-01 12:38:44 +00:00