diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 735390d25d..264448aa04 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1817,6 +1817,38 @@ Output: #### Output: """ + +VOICE_MODE_PROMPT_TEMPLATE = PersistentConfig( + "VOICE_MODE_PROMPT_TEMPLATE", + "task.voice.prompt_template", + os.environ.get("VOICE_MODE_PROMPT_TEMPLATE", ""), +) + +DEFAULT_VOICE_MODE_PROMPT_TEMPLATE = """You are a friendly, concise voice assistant. + +Everything you say will be spoken aloud. +Keep responses short, clear, and natural. + +STYLE: +- Use simple words and short sentences. +- Sound warm and conversational. +- Avoid long explanations, lists, or complex phrasing. + +BEHAVIOR: +- Give the quickest helpful answer first. +- Offer extra detail only if needed. +- Ask for clarification only when necessary. + +VOICE OPTIMIZATION: +- Break information into small, easy-to-hear chunks. +- Avoid dense wording or anything that sounds like reading text. + +ERROR HANDLING: +- If unsure, say so briefly and offer options. +- If something is unsafe or impossible, decline kindly and suggest a safe alternative. + +Stay consistent, helpful, and easy to listen to.""" + TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig( "TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE", "task.tools.prompt_template", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 7aeb44ea06..70475a7f7b 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -429,6 +429,7 @@ from open_webui.config import ( TAGS_GENERATION_PROMPT_TEMPLATE, IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE, TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE, + VOICE_MODE_PROMPT_TEMPLATE, QUERY_GENERATION_PROMPT_TEMPLATE, AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE, AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH, @@ -1208,6 +1209,7 @@ app.state.config.AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = ( app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH = ( AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH ) +app.state.config.VOICE_MODE_PROMPT_TEMPLATE = VOICE_MODE_PROMPT_TEMPLATE ######################################## diff --git a/backend/open_webui/routers/tasks.py b/backend/open_webui/routers/tasks.py index 7585466f69..040c2382d7 100644 --- a/backend/open_webui/routers/tasks.py +++ b/backend/open_webui/routers/tasks.py @@ -33,6 +33,7 @@ from open_webui.config import ( DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE, DEFAULT_EMOJI_GENERATION_PROMPT_TEMPLATE, DEFAULT_MOA_GENERATION_PROMPT_TEMPLATE, + DEFAULT_VOICE_MODE_PROMPT_TEMPLATE, ) from open_webui.env import SRC_LOG_LEVELS @@ -68,6 +69,7 @@ async def get_task_config(request: Request, user=Depends(get_verified_user)): "ENABLE_RETRIEVAL_QUERY_GENERATION": request.app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION, "QUERY_GENERATION_PROMPT_TEMPLATE": request.app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE, "TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": request.app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE, + "VOICE_MODE_PROMPT_TEMPLATE": request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE, } @@ -87,6 +89,7 @@ class TaskConfigForm(BaseModel): ENABLE_RETRIEVAL_QUERY_GENERATION: bool QUERY_GENERATION_PROMPT_TEMPLATE: str TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE: str + VOICE_MODE_PROMPT_TEMPLATE: Optional[str] @router.post("/config/update") @@ -136,6 +139,10 @@ async def update_task_config( form_data.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE ) + request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE = ( + form_data.VOICE_MODE_PROMPT_TEMPLATE + ) + return { "TASK_MODEL": request.app.state.config.TASK_MODEL, "TASK_MODEL_EXTERNAL": request.app.state.config.TASK_MODEL_EXTERNAL, @@ -152,6 +159,7 @@ async def update_task_config( "ENABLE_RETRIEVAL_QUERY_GENERATION": request.app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION, "QUERY_GENERATION_PROMPT_TEMPLATE": request.app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE, "TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": request.app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE, + "VOICE_MODE_PROMPT_TEMPLATE": request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE, } diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 3091757a04..720a9eb1a7 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -104,6 +104,7 @@ from open_webui.utils.mcp.client import MCPClient from open_webui.config import ( CACHE_DIR, + DEFAULT_VOICE_MODE_PROMPT_TEMPLATE, DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE, DEFAULT_CODE_INTERPRETER_PROMPT, CODE_INTERPRETER_BLOCKED_MODULES, @@ -1237,6 +1238,18 @@ async def process_chat_payload(request, form_data, user, metadata, model): features = form_data.pop("features", None) if features: + if "voice" in features and features["voice"]: + if request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE != None: + if request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE != "": + template = request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE + else: + template = DEFAULT_VOICE_MODE_PROMPT_TEMPLATE + + form_data["messages"] = add_or_update_system_message( + template, + form_data["messages"], + ) + if "memory" in features and features["memory"]: form_data = await chat_memory_handler( request, form_data, extra_params, user diff --git a/src/lib/components/admin/Settings/Interface.svelte b/src/lib/components/admin/Settings/Interface.svelte index 37e80a75d2..58165a8e5f 100644 --- a/src/lib/components/admin/Settings/Interface.svelte +++ b/src/lib/components/admin/Settings/Interface.svelte @@ -41,7 +41,8 @@ ENABLE_SEARCH_QUERY_GENERATION: true, ENABLE_RETRIEVAL_QUERY_GENERATION: true, QUERY_GENERATION_PROMPT_TEMPLATE: '', - TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE: '' + TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE: '', + VOICE_MODE_PROMPT_TEMPLATE: '' }; let promptSuggestions = []; @@ -237,6 +238,41 @@ {/if} +