Update backend schema
This commit is contained in:
@@ -1,24 +1,203 @@
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
from typing import List, Optional
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
# ============ Enums ============
|
||||
class AssistantConfigMode(str, Enum):
|
||||
PLATFORM = "platform"
|
||||
DIFY = "dify"
|
||||
FASTGPT = "fastgpt"
|
||||
NONE = "none"
|
||||
|
||||
|
||||
class LLMModelType(str, Enum):
|
||||
TEXT = "text"
|
||||
EMBEDDING = "embedding"
|
||||
RERANK = "rerank"
|
||||
|
||||
|
||||
class ASRLanguage(str, Enum):
|
||||
ZH = "zh"
|
||||
EN = "en"
|
||||
MULTILINGUAL = "Multi-lingual"
|
||||
|
||||
|
||||
class VoiceGender(str, Enum):
|
||||
MALE = "Male"
|
||||
FEMALE = "Female"
|
||||
|
||||
|
||||
class CallRecordSource(str, Enum):
|
||||
DEBUG = "debug"
|
||||
EXTERNAL = "external"
|
||||
|
||||
|
||||
class CallRecordStatus(str, Enum):
|
||||
CONNECTED = "connected"
|
||||
MISSED = "missed"
|
||||
FAILED = "failed"
|
||||
|
||||
|
||||
# ============ Voice ============
|
||||
class VoiceBase(BaseModel):
|
||||
name: str
|
||||
vendor: str
|
||||
gender: str
|
||||
language: str
|
||||
description: str
|
||||
gender: str # "Male" | "Female"
|
||||
language: str # "zh" | "en"
|
||||
description: str = ""
|
||||
|
||||
|
||||
class VoiceCreate(VoiceBase):
|
||||
model: str # 厂商语音模型标识
|
||||
voice_key: str # 厂商voice_key
|
||||
speed: float = 1.0
|
||||
gain: int = 0
|
||||
pitch: int = 0
|
||||
enabled: bool = True
|
||||
|
||||
|
||||
class VoiceUpdate(BaseModel):
|
||||
name: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
model: Optional[str] = None
|
||||
voice_key: Optional[str] = None
|
||||
speed: Optional[float] = None
|
||||
gain: Optional[int] = None
|
||||
pitch: Optional[int] = None
|
||||
enabled: Optional[bool] = None
|
||||
|
||||
|
||||
class VoiceOut(VoiceBase):
|
||||
id: str
|
||||
user_id: Optional[int] = None
|
||||
model: Optional[str] = None
|
||||
voice_key: Optional[str] = None
|
||||
speed: float = 1.0
|
||||
gain: int = 0
|
||||
pitch: int = 0
|
||||
enabled: bool = True
|
||||
is_system: bool = False
|
||||
created_at: Optional[datetime] = None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class VoicePreviewRequest(BaseModel):
|
||||
text: str
|
||||
speed: Optional[float] = None
|
||||
gain: Optional[int] = None
|
||||
pitch: Optional[int] = None
|
||||
|
||||
|
||||
class VoicePreviewResponse(BaseModel):
|
||||
success: bool
|
||||
audio_url: Optional[str] = None
|
||||
duration_ms: Optional[int] = None
|
||||
error: Optional[str] = None
|
||||
|
||||
|
||||
# ============ LLM Model ============
|
||||
class LLMModelBase(BaseModel):
|
||||
name: str
|
||||
vendor: str
|
||||
type: LLMModelType
|
||||
base_url: str
|
||||
api_key: str
|
||||
model_name: Optional[str] = None
|
||||
temperature: Optional[float] = None
|
||||
context_length: Optional[int] = None
|
||||
enabled: bool = True
|
||||
|
||||
|
||||
class LLMModelCreate(LLMModelBase):
|
||||
pass
|
||||
|
||||
|
||||
class LLMModelUpdate(BaseModel):
|
||||
name: Optional[str] = None
|
||||
base_url: Optional[str] = None
|
||||
api_key: Optional[str] = None
|
||||
model_name: Optional[str] = None
|
||||
temperature: Optional[float] = None
|
||||
context_length: Optional[int] = None
|
||||
enabled: Optional[bool] = None
|
||||
|
||||
|
||||
class LLMModelOut(LLMModelBase):
|
||||
id: str
|
||||
user_id: int
|
||||
created_at: Optional[datetime] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class LLMModelTestResponse(BaseModel):
|
||||
success: bool
|
||||
latency_ms: Optional[int] = None
|
||||
message: Optional[str] = None
|
||||
|
||||
|
||||
# ============ ASR Model ============
|
||||
class ASRModelBase(BaseModel):
|
||||
name: str
|
||||
vendor: str
|
||||
language: str # "zh" | "en" | "Multi-lingual"
|
||||
base_url: str
|
||||
api_key: str
|
||||
model_name: Optional[str] = None
|
||||
enabled: bool = True
|
||||
|
||||
|
||||
class ASRModelCreate(ASRModelBase):
|
||||
hotwords: List[str] = []
|
||||
enable_punctuation: bool = True
|
||||
enable_normalization: bool = True
|
||||
|
||||
|
||||
class ASRModelUpdate(BaseModel):
|
||||
name: Optional[str] = None
|
||||
language: Optional[str] = None
|
||||
base_url: Optional[str] = None
|
||||
api_key: Optional[str] = None
|
||||
model_name: Optional[str] = None
|
||||
hotwords: Optional[List[str]] = None
|
||||
enable_punctuation: Optional[bool] = None
|
||||
enable_normalization: Optional[bool] = None
|
||||
enabled: Optional[bool] = None
|
||||
|
||||
|
||||
class ASRModelOut(ASRModelBase):
|
||||
id: str
|
||||
user_id: int
|
||||
hotwords: List[str] = []
|
||||
enable_punctuation: bool = True
|
||||
enable_normalization: bool = True
|
||||
created_at: Optional[datetime] = None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class ASRTestRequest(BaseModel):
|
||||
audio_url: Optional[str] = None
|
||||
audio_data: Optional[str] = None # base64 encoded
|
||||
|
||||
|
||||
class ASRTestResponse(BaseModel):
|
||||
success: bool
|
||||
transcript: Optional[str] = None
|
||||
language: Optional[str] = None
|
||||
confidence: Optional[float] = None
|
||||
duration_ms: Optional[int] = None
|
||||
latency_ms: Optional[int] = None
|
||||
error: Optional[str] = None
|
||||
|
||||
|
||||
# ============ Assistant ============
|
||||
class AssistantBase(BaseModel):
|
||||
name: str
|
||||
@@ -34,25 +213,56 @@ class AssistantBase(BaseModel):
|
||||
configMode: str = "platform"
|
||||
apiUrl: Optional[str] = None
|
||||
apiKey: Optional[str] = None
|
||||
# 模型关联
|
||||
llmModelId: Optional[str] = None
|
||||
asrModelId: Optional[str] = None
|
||||
embeddingModelId: Optional[str] = None
|
||||
rerankModelId: Optional[str] = None
|
||||
|
||||
|
||||
class AssistantCreate(AssistantBase):
|
||||
pass
|
||||
|
||||
|
||||
class AssistantUpdate(AssistantBase):
|
||||
class AssistantUpdate(BaseModel):
|
||||
name: Optional[str] = None
|
||||
opener: Optional[str] = None
|
||||
prompt: Optional[str] = None
|
||||
knowledgeBaseId: Optional[str] = None
|
||||
language: Optional[str] = None
|
||||
voice: Optional[str] = None
|
||||
speed: Optional[float] = None
|
||||
hotwords: Optional[List[str]] = None
|
||||
tools: Optional[List[str]] = None
|
||||
interruptionSensitivity: Optional[int] = None
|
||||
configMode: Optional[str] = None
|
||||
apiUrl: Optional[str] = None
|
||||
apiKey: Optional[str] = None
|
||||
llmModelId: Optional[str] = None
|
||||
asrModelId: Optional[str] = None
|
||||
embeddingModelId: Optional[str] = None
|
||||
rerankModelId: Optional[str] = None
|
||||
|
||||
|
||||
class AssistantOut(AssistantBase):
|
||||
id: str
|
||||
callCount: int = 0
|
||||
created_at: Optional[datetime] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class AssistantStats(BaseModel):
|
||||
assistant_id: str
|
||||
total_calls: int = 0
|
||||
connected_calls: int = 0
|
||||
missed_calls: int = 0
|
||||
avg_duration_seconds: float = 0.0
|
||||
today_calls: int = 0
|
||||
|
||||
|
||||
# ============ Knowledge Base ============
|
||||
class KnowledgeDocument(BaseModel):
|
||||
id: str
|
||||
@@ -196,6 +406,7 @@ class TranscriptSegment(BaseModel):
|
||||
endMs: int
|
||||
durationMs: Optional[int] = None
|
||||
audioUrl: Optional[str] = None
|
||||
emotion: Optional[str] = None
|
||||
|
||||
|
||||
class CallRecordCreate(BaseModel):
|
||||
@@ -208,6 +419,9 @@ class CallRecordUpdate(BaseModel):
|
||||
status: Optional[str] = None
|
||||
summary: Optional[str] = None
|
||||
duration_seconds: Optional[int] = None
|
||||
ended_at: Optional[str] = None
|
||||
cost: Optional[float] = None
|
||||
metadata: Optional[dict] = None
|
||||
|
||||
|
||||
class CallRecordOut(BaseModel):
|
||||
@@ -220,6 +434,9 @@ class CallRecordOut(BaseModel):
|
||||
ended_at: Optional[str] = None
|
||||
duration_seconds: Optional[int] = None
|
||||
summary: Optional[str] = None
|
||||
cost: float = 0.0
|
||||
metadata: dict = {}
|
||||
created_at: Optional[datetime] = None
|
||||
transcripts: List[TranscriptSegment] = []
|
||||
|
||||
class Config:
|
||||
@@ -246,6 +463,19 @@ class TranscriptOut(TranscriptCreate):
|
||||
from_attributes = True
|
||||
|
||||
|
||||
# ============ History Stats ============
|
||||
class HistoryStats(BaseModel):
|
||||
total_calls: int = 0
|
||||
connected_calls: int = 0
|
||||
missed_calls: int = 0
|
||||
failed_calls: int = 0
|
||||
avg_duration_seconds: float = 0.0
|
||||
total_cost: float = 0.0
|
||||
by_status: dict = {}
|
||||
by_source: dict = {}
|
||||
daily_trend: List[dict] = []
|
||||
|
||||
|
||||
# ============ Dashboard ============
|
||||
class DashboardStats(BaseModel):
|
||||
totalCalls: int
|
||||
@@ -269,3 +499,9 @@ class ListResponse(BaseModel):
|
||||
page: int
|
||||
limit: int
|
||||
list: List
|
||||
|
||||
|
||||
class SearchResult(BaseModel):
|
||||
id: str
|
||||
started_at: str
|
||||
matched_content: Optional[str] = None
|
||||
|
||||
Reference in New Issue
Block a user