- SQLite-Store (app/store.py) hinter Store-Interface: Nutzer + Sessions persistent - Bearer-Token-Auth (app/auth.py); Nutzerverwaltung via Admin-Key (POST /api/admin/users) - GET /api/me, PUT /api/me/prefs (dauerhafte Nutzer-Praeferenzen) - chat/speak/transcribe/sessions auth-geschuetzt; Mandanten-Trennung (fremde Session -> 403) - Route-Aufloesung: Defaults < Profil < ENV < Nutzer-Prefs < Session < Request - SessionManager (in-memory) durch Store ersetzt - AUTH_ENABLED-Schalter (prod an, dev/Tests aus); DB_PATH/ADMIN_API_KEY - Doku aktualisiert (README, BEDIENUNGSANLEITUNG, Architektur, deploy-env); data/ gitignored - Tests: 29 gruen (Auth, Mandanten, Persistenz, Routing) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
90 lines
2.2 KiB
Python
90 lines
2.2 KiB
Python
from typing import Literal
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class EndpointCapabilities(BaseModel):
|
|
id: str
|
|
kind: str
|
|
direction: Literal["input", "output"]
|
|
sample_rate: int = 16000
|
|
channels: int = 1
|
|
latency_class: Literal["low", "medium", "high"] = "medium"
|
|
supports_aec: bool = False
|
|
supports_barge_in: bool = False
|
|
networked: bool = False
|
|
bluetooth: bool = False
|
|
mobile: bool = False
|
|
default: bool = False
|
|
|
|
|
|
class AudioChunk(BaseModel):
|
|
data: bytes
|
|
sample_rate: int = 16000
|
|
channels: int = 1
|
|
format: str = "wav"
|
|
timestamp_ms: int = 0
|
|
|
|
|
|
class PipelineTrace(BaseModel):
|
|
raw_transcript: str | None = None
|
|
cleaned_transcript: str | None = None
|
|
semantic_response: str | None = None
|
|
spoken_response: str | None = None
|
|
tts_ready_text: str | None = None
|
|
|
|
|
|
class SpeakRequest(BaseModel):
|
|
text: str = Field(min_length=1)
|
|
voice: str | None = None
|
|
language: str | None = None
|
|
output_endpoint: str | None = None
|
|
tts_provider: str | None = None
|
|
|
|
|
|
class ChatRequest(BaseModel):
|
|
text: str = Field(min_length=1)
|
|
input_endpoint: str | None = None
|
|
output_endpoint: str | None = None
|
|
language: str | None = None
|
|
voice: str | None = None
|
|
stt_provider: str | None = None
|
|
llm_provider: str | None = None
|
|
tts_provider: str | None = None
|
|
|
|
|
|
class SessionRouteRequest(BaseModel):
|
|
input_endpoint: str | None = None
|
|
output_endpoint: str | None = None
|
|
stt_provider: str | None = None
|
|
llm_provider: str | None = None
|
|
tts_provider: str | None = None
|
|
language: str | None = None
|
|
|
|
|
|
class RouteInfo(BaseModel):
|
|
input_endpoint: str
|
|
output_endpoint: str
|
|
stt_provider: str
|
|
llm_provider: str
|
|
tts_provider: str
|
|
language: str
|
|
|
|
|
|
class UserCreate(BaseModel):
|
|
display_name: str = Field(min_length=1)
|
|
|
|
|
|
class UserCreated(BaseModel):
|
|
user_id: str
|
|
display_name: str
|
|
token: str # nur bei Erstellung sichtbar
|
|
|
|
|
|
class UserPrefs(BaseModel):
|
|
input_endpoint: str | None = None
|
|
output_endpoint: str | None = None
|
|
stt_provider: str | None = None
|
|
llm_provider: str | None = None
|
|
tts_provider: str | None = None
|
|
language: str | None = None
|
|
|