update voice system prompt override

This commit is contained in:
Huaaudio 2026-03-23 04:57:31 +01:00
parent 47c5956e24
commit f237aba2a3
2 changed files with 64 additions and 22 deletions

View file

@ -79,6 +79,7 @@ type processOptions struct {
UserMessage string // User message content (may include prefix) UserMessage string // User message content (may include prefix)
SystemPromptOverride string // Override the default system prompt (Used by SubTurns) SystemPromptOverride string // Override the default system prompt (Used by SubTurns)
Media []string // media:// refs from inbound message Media []string // media:// refs from inbound message
IsVoice bool // True if this message comes from an audio/voice call
InitialSteeringMessages []providers.Message // Steering messages from refactor/agent InitialSteeringMessages []providers.Message // Steering messages from refactor/agent
DefaultResponse string // Response when LLM returns empty DefaultResponse string // Response when LLM returns empty
EnableSummary bool // Whether to trigger summarization EnableSummary bool // Whether to trigger summarization
@ -1295,6 +1296,12 @@ func (al *AgentLoop) processMessage(ctx context.Context, msg bus.InboundMessage)
"route_channel": route.Channel, "route_channel": route.Channel,
}) })
isVoice := msg.Metadata != nil && msg.Metadata["is_voice"] == "true"
var systemPromptOverride string
if isVoice {
systemPromptOverride = "You are a helpful AI assistant. The user is speaking to you over voice chat. Reply in a concise, conversational, and natural oral style suitable for text-to-speech. Get straight to the point. Do not use Markdown, emojis, asterisks, or code blocks."
}
opts := processOptions{ opts := processOptions{
SessionKey: sessionKey, SessionKey: sessionKey,
Channel: msg.Channel, Channel: msg.Channel,
@ -1302,7 +1309,9 @@ func (al *AgentLoop) processMessage(ctx context.Context, msg bus.InboundMessage)
SenderID: msg.SenderID, SenderID: msg.SenderID,
SenderDisplayName: msg.Sender.DisplayName, SenderDisplayName: msg.Sender.DisplayName,
UserMessage: msg.Content, UserMessage: msg.Content,
SystemPromptOverride: systemPromptOverride,
Media: msg.Media, Media: msg.Media,
IsVoice: isVoice,
DefaultResponse: defaultResponse, DefaultResponse: defaultResponse,
EnableSummary: true, EnableSummary: true,
SendResponse: false, SendResponse: false,
@ -1598,7 +1607,28 @@ func (al *AgentLoop) runTurn(ctx context.Context, ts *turnState) (turnResult, er
} }
ts.captureRestorePoint(history, summary) ts.captureRestorePoint(history, summary)
messages := ts.agent.ContextBuilder.BuildMessages( var messages []providers.Message
if ts.opts.SystemPromptOverride != "" {
messages = append(messages, providers.Message{
Role: "system",
Content: ts.opts.SystemPromptOverride,
})
messages = append(messages, history...)
if summary != "" {
messages = append(messages, providers.Message{
Role: "system",
Content: "CONTEXT_SUMMARY: " + summary,
})
}
if ts.userMessage != "" || len(ts.media) > 0 {
messages = append(messages, providers.Message{
Role: "user",
Content: ts.userMessage,
Media: ts.media,
})
}
} else {
messages = ts.agent.ContextBuilder.BuildMessages(
history, history,
summary, summary,
ts.userMessage, ts.userMessage,
@ -1608,13 +1638,17 @@ func (al *AgentLoop) runTurn(ctx context.Context, ts *turnState) (turnResult, er
ts.opts.SenderID, ts.opts.SenderID,
ts.opts.SenderDisplayName, ts.opts.SenderDisplayName,
) )
}
cfg := al.GetConfig() cfg := al.GetConfig()
maxMediaSize := cfg.Agents.Defaults.GetMaxMediaSize() maxMediaSize := cfg.Agents.Defaults.GetMaxMediaSize()
messages = resolveMediaRefs(messages, al.mediaStore, maxMediaSize) messages = resolveMediaRefs(messages, al.mediaStore, maxMediaSize)
if !ts.opts.NoHistory { if !ts.opts.NoHistory {
toolDefs := ts.agent.Tools.ToProviderDefs() var toolDefs []providers.ToolDefinition
if !ts.opts.IsVoice {
toolDefs = ts.agent.Tools.ToProviderDefs()
}
if isOverContextBudget(ts.agent.ContextWindow, messages, toolDefs, ts.agent.MaxTokens) { if isOverContextBudget(ts.agent.ContextWindow, messages, toolDefs, ts.agent.MaxTokens) {
logger.WarnCF("agent", "Proactive compression: context budget exceeded before LLM call", logger.WarnCF("agent", "Proactive compression: context budget exceeded before LLM call",
map[string]any{"session_key": ts.sessionKey}) map[string]any{"session_key": ts.sessionKey})
@ -1752,7 +1786,10 @@ turnLoop:
}) })
gracefulTerminal, _ := ts.gracefulInterruptRequested() gracefulTerminal, _ := ts.gracefulInterruptRequested()
providerToolDefs := ts.agent.Tools.ToProviderDefs() var providerToolDefs []providers.ToolDefinition
if !ts.opts.IsVoice {
providerToolDefs = ts.agent.Tools.ToProviderDefs()
}
// Native web search support (from HEAD) // Native web search support (from HEAD)
_, hasWebSearch := ts.agent.Tools.Get("web_search") _, hasWebSearch := ts.agent.Tools.Get("web_search")

View file

@ -65,3 +65,8 @@ func DerefStr(s *string, fallback string) string {
} }
return *s return *s
} }
// IsTruncationDisabled returns whether truncation is disabled globally
func IsTruncationDisabled() bool {
return disableTruncation.Load()
}