mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 07:03:53 +08:00
239 lines
7.0 KiB
Python
239 lines
7.0 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from pydantic import Field, field_validator
|
|
from pydantic_core import PydanticCustomError
|
|
|
|
from app.schemas.common import JavaModel
|
|
|
|
|
|
class AgentCreate(JavaModel):
|
|
agent_name: str
|
|
|
|
@field_validator("agent_name", mode="before")
|
|
@classmethod
|
|
def require_non_blank_name(cls, value: Any) -> Any:
|
|
if value is None or isinstance(value, str) and not value.strip():
|
|
raise PydanticCustomError("java_not_blank", "智能体名称不能为空")
|
|
return value
|
|
|
|
|
|
class AgentMemory(JavaModel):
|
|
summary_memory: str | None = None
|
|
|
|
|
|
class ContextProvider(JavaModel):
|
|
url: str | None = None
|
|
headers: dict[str, Any] | None = None
|
|
|
|
|
|
class FunctionInfo(JavaModel):
|
|
plugin_id: str | None = None
|
|
param_info: dict[str, Any] = Field(default_factory=dict)
|
|
|
|
@field_validator("param_info", mode="before")
|
|
@classmethod
|
|
def normalize_param_info(cls, value: Any) -> dict[str, Any]:
|
|
if value is None or value == "":
|
|
return {}
|
|
if isinstance(value, str):
|
|
parsed = json.loads(value)
|
|
if not isinstance(parsed, dict):
|
|
raise ValueError("paramInfo must be a JSON object")
|
|
return {str(key): item for key, item in parsed.items()}
|
|
if isinstance(value, dict):
|
|
return {str(key): item for key, item in value.items() if key is not None}
|
|
parsed = json.loads(json.dumps(value))
|
|
if not isinstance(parsed, dict):
|
|
raise ValueError("paramInfo must be an object")
|
|
return {str(key): item for key, item in parsed.items()}
|
|
|
|
|
|
class AgentUpdate(JavaModel):
|
|
agent_code: str | None = None
|
|
agent_name: str | None = None
|
|
asr_model_id: str | None = None
|
|
vad_model_id: str | None = None
|
|
llm_model_id: str | None = None
|
|
slm_model_id: str | None = None
|
|
vllm_model_id: str | None = None
|
|
tts_model_id: str | None = None
|
|
tts_voice_id: str | None = None
|
|
tts_language: str | None = None
|
|
tts_volume: int | None = None
|
|
tts_rate: int | None = None
|
|
tts_pitch: int | None = None
|
|
mem_model_id: str | None = None
|
|
intent_model_id: str | None = None
|
|
functions: list[FunctionInfo] | None = None
|
|
system_prompt: str | None = None
|
|
summary_memory: str | None = None
|
|
chat_history_conf: int | None = None
|
|
lang_code: str | None = None
|
|
language: str | None = None
|
|
sort: int | None = None
|
|
context_providers: list[ContextProvider] | None = None
|
|
correct_word_file_ids: list[str] | None = None
|
|
tag_names: list[str] | None = None
|
|
tag_ids: list[str] | None = None
|
|
|
|
|
|
class AgentChatHistoryReport(JavaModel):
|
|
mac_address: str
|
|
session_id: str
|
|
chat_type: int
|
|
content: str
|
|
audio_base64: str | None = None
|
|
report_time: int | None = None
|
|
|
|
@field_validator("mac_address", "session_id", "content", mode="before")
|
|
@classmethod
|
|
def require_non_blank(cls, value: Any) -> Any:
|
|
if value is None or isinstance(value, str) and not value.strip():
|
|
raise PydanticCustomError("java_not_blank", "不能为空")
|
|
return value
|
|
|
|
@field_validator("chat_type", mode="before")
|
|
@classmethod
|
|
def require_chat_type(cls, value: Any) -> Any:
|
|
if value is None:
|
|
raise PydanticCustomError("java_not_null", "不能为空")
|
|
return value
|
|
|
|
|
|
class AgentSnapshotPage(JavaModel):
|
|
page: int | None = 1
|
|
limit: int | None = 10
|
|
max_version_no: int | None = None
|
|
|
|
def page_or_default(self) -> int:
|
|
return self.page if self.page is not None and self.page >= 1 else 1
|
|
|
|
def limit_or_default(self) -> int:
|
|
return self.limit if self.limit is not None and self.limit >= 1 else 10
|
|
|
|
|
|
class AgentSnapshotRestore(JavaModel):
|
|
current_state_token: str
|
|
|
|
@field_validator("current_state_token", mode="before")
|
|
@classmethod
|
|
def require_non_blank_token(cls, value: Any) -> Any:
|
|
if value is None or isinstance(value, str) and not value.strip():
|
|
raise PydanticCustomError("java_not_blank", "不能为空")
|
|
return value
|
|
|
|
|
|
class AgentSnapshotTag(JavaModel):
|
|
id: str | None = None
|
|
tag_name: str | None = None
|
|
sort: int | None = None
|
|
|
|
|
|
class AgentSnapshotData(JavaModel):
|
|
agent_code: str | None = None
|
|
agent_name: str | None = None
|
|
asr_model_id: str | None = None
|
|
vad_model_id: str | None = None
|
|
llm_model_id: str | None = None
|
|
slm_model_id: str | None = None
|
|
vllm_model_id: str | None = None
|
|
tts_model_id: str | None = None
|
|
tts_voice_id: str | None = None
|
|
tts_language: str | None = None
|
|
tts_volume: int | None = None
|
|
tts_rate: int | None = None
|
|
tts_pitch: int | None = None
|
|
mem_model_id: str | None = None
|
|
intent_model_id: str | None = None
|
|
chat_history_conf: int | None = None
|
|
system_prompt: str | None = None
|
|
summary_memory: str | None = None
|
|
lang_code: str | None = None
|
|
language: str | None = None
|
|
sort: int | None = None
|
|
functions: list[FunctionInfo] | None = None
|
|
context_providers: list[ContextProvider] | None = None
|
|
correct_word_file_ids: list[str] | None = None
|
|
tag_names: list[str] | None = None
|
|
tags: list[AgentSnapshotTag] | None = None
|
|
|
|
|
|
class AgentTemplate(JavaModel):
|
|
id: str | None = None
|
|
agent_code: str | None = None
|
|
agent_name: str | None = None
|
|
asr_model_id: str | None = None
|
|
vad_model_id: str | None = None
|
|
llm_model_id: str | None = None
|
|
vllm_model_id: str | None = None
|
|
tts_model_id: str | None = None
|
|
tts_voice_id: str | None = None
|
|
tts_language: str | None = None
|
|
tts_volume: int | None = None
|
|
tts_rate: int | None = None
|
|
tts_pitch: int | None = None
|
|
mem_model_id: str | None = None
|
|
intent_model_id: str | None = None
|
|
chat_history_conf: int | None = None
|
|
system_prompt: str | None = None
|
|
summary_memory: str | None = None
|
|
lang_code: str | None = None
|
|
language: str | None = None
|
|
sort: int | None = None
|
|
creator: int | None = None
|
|
created_at: datetime | None = None
|
|
updater: int | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
|
|
class AgentVoicePrintSave(JavaModel):
|
|
agent_id: str | None = None
|
|
audio_id: str | None = None
|
|
source_name: str | None = None
|
|
introduce: str | None = None
|
|
|
|
|
|
class AgentVoicePrintUpdate(JavaModel):
|
|
id: str | None = None
|
|
audio_id: str | None = None
|
|
source_name: str | None = None
|
|
introduce: str | None = None
|
|
|
|
|
|
class AgentTagAssignment(JavaModel):
|
|
tag_ids: list[str] | None = None
|
|
tag_names: list[str] | None = None
|
|
|
|
|
|
SNAPSHOT_FIELD_ORDER = [
|
|
"agentCode",
|
|
"agentName",
|
|
"asrModelId",
|
|
"vadModelId",
|
|
"llmModelId",
|
|
"slmModelId",
|
|
"vllmModelId",
|
|
"ttsModelId",
|
|
"ttsVoiceId",
|
|
"ttsLanguage",
|
|
"ttsVolume",
|
|
"ttsRate",
|
|
"ttsPitch",
|
|
"memModelId",
|
|
"intentModelId",
|
|
"chatHistoryConf",
|
|
"systemPrompt",
|
|
"summaryMemory",
|
|
"langCode",
|
|
"language",
|
|
"sort",
|
|
"functions",
|
|
"contextProviders",
|
|
"correctWordFileIds",
|
|
"tagNames",
|
|
]
|