🎨 优化预设正则解析
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user