Files
praxis/server/services/__init__.py
T
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

36 lines
795 B
Python

"""Praxis service interfaces and adapter registry.
Public API:
from server.services import TTSProvider, LLMProvider, Guardrail
from server.services import get_tts, get_llm, get_guardrail
Adapters are resolved from env vars:
PRAXIS_TTS=cartesia|piper
OLLAMA_ROLEPLAY_MODEL / OLLAMA_DEBRIEF_MODEL
"""
from __future__ import annotations
from server.services.base import (
Guardrail,
GuardrailContext,
GuardrailVerdict,
LLMProvider,
LLMStreamChunk,
TTSProvider,
TTSResult,
)
from server.services.registry import get_guardrail, get_llm, get_tts
__all__ = [
"TTSProvider",
"TTSResult",
"LLMProvider",
"LLMStreamChunk",
"Guardrail",
"GuardrailVerdict",
"GuardrailContext",
"get_tts",
"get_llm",
"get_guardrail",
]