🎨 优化预设正则解析

This commit is contained in:
2026-03-03 20:33:46 +08:00
parent f8306be916
commit f4ff763b78
12 changed files with 678 additions and 29 deletions

View File

@@ -8,16 +8,29 @@ import (
"git.echol.cn/loser/ai_proxy/server/model/app"
"git.echol.cn/loser/ai_proxy/server/model/app/request"
"git.echol.cn/loser/ai_proxy/server/model/app/response"
)
// PresetInjector 预设注入器
type PresetInjector struct {
preset *app.AiPreset
preset *app.AiPreset
regexLogs *response.RegexExecutionLogs
}
// NewPresetInjector 创建预设注入器
func NewPresetInjector(preset *app.AiPreset) *PresetInjector {
return &PresetInjector{preset: preset}
return &PresetInjector{
preset: preset,
regexLogs: &response.RegexExecutionLogs{
InputScripts: []response.RegexScriptLog{},
OutputScripts: []response.RegexScriptLog{},
},
}
}
// GetRegexLogs 获取正则脚本执行日志
func (p *PresetInjector) GetRegexLogs() *response.RegexExecutionLogs {
return p.regexLogs
}
// InjectMessages 注入预设到消息列表
@@ -196,8 +209,8 @@ func (p *PresetInjector) applyRegexScripts(messages []request.ChatMessage, place
// 检查 placement
hasPlacement := false
for _, p := range script.Placement {
if p == placement {
for _, pl := range script.Placement {
if pl == placement {
hasPlacement = true
break
}
@@ -206,15 +219,34 @@ func (p *PresetInjector) applyRegexScripts(messages []request.ChatMessage, place
continue
}
// 应用正则替换
messages = p.applyRegexScript(messages, script)
// 应用正则替换并记录日志
var matchCount int
var err error
messages, matchCount, err = p.applyRegexScriptWithLog(messages, script)
// 记录执行日志
log := response.RegexScriptLog{
ScriptName: script.ScriptName,
ScriptID: script.ID,
Executed: true,
MatchCount: matchCount,
}
if err != nil {
log.ErrorMessage = err.Error()
}
// 根据 placement 添加到对应的日志列表
if placement == 1 {
p.regexLogs.InputScripts = append(p.regexLogs.InputScripts, log)
}
p.regexLogs.TotalMatches += matchCount
}
return messages
}
// applyRegexScript 应用单个正则脚本
func (p *PresetInjector) applyRegexScript(messages []request.ChatMessage, script app.RegexScript) []request.ChatMessage {
// applyRegexScriptWithLog 应用单个正则脚本并返回匹配次数
func (p *PresetInjector) applyRegexScriptWithLog(messages []request.ChatMessage, script app.RegexScript) ([]request.ChatMessage, int, error) {
// 解析正则表达式
pattern := script.FindRegex
// 移除正则标志(如 /pattern/g)
@@ -229,19 +261,25 @@ func (p *PresetInjector) applyRegexScript(messages []request.ChatMessage, script
re, err := regexp.Compile(pattern)
if err != nil {
return messages
return messages, 0, fmt.Errorf("正则编译失败: %v", err)
}
matchCount := 0
// 对每条消息应用替换
for i := range messages {
if script.PromptOnly && messages[i].Role != "user" {
continue
}
// 统计匹配次数
matches := re.FindAllString(messages[i].Content, -1)
matchCount += len(matches)
// 执行替换
messages[i].Content = re.ReplaceAllString(messages[i].Content, script.ReplaceString)
}
return messages
return messages, matchCount, nil
}
// ProcessResponse 处理AI响应(应用输出后的正则)
@@ -280,10 +318,31 @@ func (p *PresetInjector) ProcessResponse(content string) string {
re, err := regexp.Compile(pattern)
if err != nil {
// 记录错误日志
p.regexLogs.OutputScripts = append(p.regexLogs.OutputScripts, response.RegexScriptLog{
ScriptName: script.ScriptName,
ScriptID: script.ID,
Executed: false,
ErrorMessage: fmt.Sprintf("正则编译失败: %v", err),
})
continue
}
// 统计匹配次数
matches := re.FindAllString(content, -1)
matchCount := len(matches)
// 执行替换
content = re.ReplaceAllString(content, script.ReplaceString)
// 记录执行日志
p.regexLogs.OutputScripts = append(p.regexLogs.OutputScripts, response.RegexScriptLog{
ScriptName: script.ScriptName,
ScriptID: script.ID,
Executed: true,
MatchCount: matchCount,
})
p.regexLogs.TotalMatches += matchCount
}
return content