feat: Enhance AI Agent and Channel Management
- Updated labels in the AI Agents dashboard for clarity, changing "流程状态" to "Playbook 状态" and "未发布流程" to "未发布 Playbook". - Introduced AI Agent rollout percentage management in channel editing, allowing users to set and rollback rollout percentages. - Added new API endpoints for rolling back AI Agent rollout and fetching agent run metrics. - Implemented new UI components for displaying agent run details, including status, duration, and input/output tokens. - Enhanced type definitions for AdminChannel and AIAgent to include rollout percentages and runtime modes. - Updated navigation to include a section for agent runs. - Added new translations for agent run features in both English and Chinese.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
package tooling
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
const maxCustomerReplyRunes = 8000
|
||||
|
||||
// NormalizeCustomerReply applies the final plain-text boundary before an AI
|
||||
// response enters a customer conversation. It rejects likely credential
|
||||
// assignments instead of masking them, because a masked secret is not useful
|
||||
// customer-facing content.
|
||||
func NormalizeCustomerReply(value string) (string, error) {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" {
|
||||
return "", fmt.Errorf("ai reply is empty")
|
||||
}
|
||||
if secretAssignmentPattern.MatchString(value) {
|
||||
return "", fmt.Errorf("ai reply contains sensitive credential data")
|
||||
}
|
||||
var builder strings.Builder
|
||||
for _, r := range value {
|
||||
if unicode.IsControl(r) && r != '\n' && r != '\t' {
|
||||
continue
|
||||
}
|
||||
builder.WriteRune(r)
|
||||
}
|
||||
value = strings.TrimSpace(builder.String())
|
||||
for strings.Contains(value, "\n\n\n") {
|
||||
value = strings.ReplaceAll(value, "\n\n\n", "\n\n")
|
||||
}
|
||||
if value == "" {
|
||||
return "", fmt.Errorf("ai reply is empty")
|
||||
}
|
||||
if len([]rune(value)) > maxCustomerReplyRunes {
|
||||
return "", fmt.Errorf("ai reply exceeds maximum length")
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
Reference in New Issue
Block a user