Add dynamic variable support to Assistant model and related components

- Introduce dynamic variable definitions in AssistantConfig and Assistant models, allowing for flexible prompt customization.
- Implement validation for dynamic variable names and types in the schema.
- Update backend services and routes to handle dynamic variables in assistant configurations and runtime processing.
- Enhance frontend components to support dynamic variable definitions, including a new editor for managing variables.
- Add tests to ensure proper functionality and validation of dynamic variables in various scenarios.
This commit is contained in:
Xin Wang
2026-07-12 23:42:56 +08:00
parent 7c9a18c806
commit deaf3d7730
21 changed files with 1396 additions and 12 deletions

View File

@@ -16,6 +16,7 @@ from loguru import logger
from models import AssistantConfig, SignalingOffer
from services.auth import require_admin, require_admin_websocket
from services.config_resolver import resolve_runtime_config
from services.runtime_variables import DynamicVariableError, prepare_dynamic_config
from starlette.websockets import WebSocketDisconnect, WebSocketState
from services.webrtc_ice import aiortc_ice_servers, client_ice_servers
@@ -52,7 +53,11 @@ async def voice_signaling(websocket: WebSocket):
{
"type": "error",
"payload": {
"message": f"语音会话启动失败: {type(e).__name__}"
"message": (
str(e)
if isinstance(e, DynamicVariableError)
else f"语音会话启动失败: {type(e).__name__}"
)
},
}
)
@@ -71,9 +76,18 @@ async def _resolve_config(offer: SignalingOffer) -> AssistantConfig:
"""优先用 assistant_id 从 DB 解析(含真 key);否则用调试内联配置。"""
if offer.assistant_id:
async with SessionLocal() as session:
return await resolve_runtime_config(session, offer.assistant_id)
cfg = await resolve_runtime_config(session, offer.assistant_id)
return prepare_dynamic_config(
cfg,
offer.dynamic_variables,
assistant_id=offer.assistant_id,
)
if offer.inline_config:
return offer.inline_config
return prepare_dynamic_config(
offer.inline_config,
offer.dynamic_variables,
assistant_id=None,
)
raise ValueError("offer 缺少 assistant_id 或 inline_config")