refactor(prompts-core): 重构代码结构和优化工具函数
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/gogf/gf/v2/encoding/gjson"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// ReverseMap 映射 payload 到 mapping
|
||||
@@ -20,80 +21,37 @@ func ReverseMap(mapping map[string]any, payload map[string]any) map[string]any {
|
||||
return jsonObj.Map()
|
||||
}
|
||||
|
||||
// ExtractUserText 从 messages map 中提取用户文本,返回标准的 user message 结构
|
||||
// ExtractUserText 从 messages 中提取所有 user 文本
|
||||
func ExtractUserText(messages map[string]any) map[string]any {
|
||||
var texts []string
|
||||
msgJson := gjson.New(messages)
|
||||
|
||||
// 1) rounds 结构:遍历每轮
|
||||
if rounds, ok := messages["rounds"].([]any); ok {
|
||||
for _, round := range rounds {
|
||||
if rm, ok := round.(map[string]any); ok {
|
||||
if msgs, ok := rm["messages"].([]any); ok {
|
||||
texts = append(texts, extractTextFromRoleUser(msgs)...)
|
||||
msgs := msgJson.Get("rounds.0.messages")
|
||||
if msgs.IsNil() {
|
||||
msgs = msgJson.Get("messages")
|
||||
}
|
||||
var texts []string
|
||||
for _, m := range msgs.Array() {
|
||||
msg := gjson.New(m)
|
||||
if msg.Get("role").String() != "user" {
|
||||
continue
|
||||
}
|
||||
content := msg.Get("content").Val()
|
||||
switch c := content.(type) {
|
||||
case string:
|
||||
texts = append(texts, c)
|
||||
case []any:
|
||||
for _, item := range c {
|
||||
if m, ok := item.(map[string]any); ok {
|
||||
if t := gconv.String(m["text"]); t != "" {
|
||||
texts = append(texts, t)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if msgs, ok := messages["messages"].([]any); ok {
|
||||
// 2) messages 结构
|
||||
texts = extractTextFromRoleUser(msgs)
|
||||
}
|
||||
|
||||
// 3) 构建返回结构
|
||||
return map[string]any{
|
||||
"role": "user",
|
||||
"content": strings.Join(texts, "\n"),
|
||||
}
|
||||
}
|
||||
|
||||
// extractTextFromRoleUser 从 messages 数组中提取所有 role=user 的文本
|
||||
func extractTextFromRoleUser(msgs []any) []string {
|
||||
var texts []string
|
||||
for _, msg := range msgs {
|
||||
m, ok := msg.(map[string]any)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if role, _ := m["role"].(string); role != "user" {
|
||||
continue
|
||||
}
|
||||
texts = append(texts, extractAllText(m["content"])...)
|
||||
}
|
||||
return texts
|
||||
}
|
||||
|
||||
// extractAllText 从 content 中提取所有文本(递归,最大兼容)
|
||||
func extractAllText(content any) []string {
|
||||
switch c := content.(type) {
|
||||
case string:
|
||||
return []string{c}
|
||||
|
||||
case []any:
|
||||
var texts []string
|
||||
for _, item := range c {
|
||||
m, ok := item.(map[string]any)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if t, ok := m["text"].(string); ok && t != "" {
|
||||
texts = append(texts, t)
|
||||
continue
|
||||
}
|
||||
for _, v := range m {
|
||||
texts = append(texts, extractAllText(v)...)
|
||||
}
|
||||
}
|
||||
return texts
|
||||
|
||||
case map[string]any:
|
||||
if t, ok := c["text"].(string); ok && t != "" {
|
||||
return []string{t}
|
||||
}
|
||||
var texts []string
|
||||
for _, v := range c {
|
||||
texts = append(texts, extractAllText(v)...)
|
||||
}
|
||||
return texts
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user