feat: 重构异步模型字段并更新依赖
This commit is contained in:
@@ -1,11 +1,9 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/gogf/gf/v2/encoding/gjson"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// ReverseMap 映射 payload 到 mapping
|
||||
@@ -22,86 +20,80 @@ func ReverseMap(mapping map[string]any, payload map[string]any) map[string]any {
|
||||
return jsonObj.Map()
|
||||
}
|
||||
|
||||
// MapResponsePayload 映射模型响应为标准格式
|
||||
func MapResponsePayload(mapping map[string]any, responseBytes []byte) ([]byte, error) {
|
||||
if len(mapping) == 0 {
|
||||
return responseBytes, nil
|
||||
}
|
||||
// ExtractUserText 从 messages map 中提取用户文本,返回标准的 user message 结构
|
||||
func ExtractUserText(messages map[string]any) map[string]any {
|
||||
var texts []string
|
||||
|
||||
responseJson := gjson.New(responseBytes)
|
||||
resultJson := gjson.New("{}")
|
||||
|
||||
for standardField, modelPath := range mapping {
|
||||
path := gconv.String(modelPath)
|
||||
if path == "" {
|
||||
continue
|
||||
}
|
||||
val := responseJson.Get(path)
|
||||
if val.IsNil() {
|
||||
continue
|
||||
}
|
||||
resultJson.Set(standardField, val.Val())
|
||||
}
|
||||
|
||||
return []byte(resultJson.String()), nil
|
||||
}
|
||||
|
||||
// ParseHeadMsgHeaders 支持多个 header 绑定,逗号分隔:
|
||||
// 示例:
|
||||
// - X-API-Key:qwen3-tts-key,operation:true,count:123
|
||||
// - X-API-Key:"qwen3-tts-key",operation:"true"
|
||||
//
|
||||
// 说明:
|
||||
// - HTTP Header 最终都是字符串,这里做的是“值的字符串化表达”。
|
||||
// - 若 value 用双引号包裹,会去掉外层引号再注入,便于在配置中区分字符串/布尔/数字等表达(以及避免值中包含特殊字符时歧义)。
|
||||
func ParseHeadMsgHeaders(headMsg string) map[string]string {
|
||||
headMsg = strings.TrimSpace(headMsg)
|
||||
if headMsg == "" {
|
||||
return nil
|
||||
}
|
||||
out := map[string]string{}
|
||||
parts := strings.Split(headMsg, ",")
|
||||
for _, p := range parts {
|
||||
p = strings.TrimSpace(p)
|
||||
if p == "" {
|
||||
continue
|
||||
}
|
||||
// HeaderName:HeaderValue(推荐) / HeaderName=HeaderValue(兼容)
|
||||
if strings.Contains(p, ":") {
|
||||
kv := strings.SplitN(p, ":", 2)
|
||||
k := strings.TrimSpace(kv[0])
|
||||
v := strings.TrimSpace(kv[1])
|
||||
v = strings.Trim(v, "\"")
|
||||
if k != "" && v != "" {
|
||||
out[k] = v
|
||||
// 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)...)
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
if strings.Contains(p, "=") {
|
||||
kv := strings.SplitN(p, "=", 2)
|
||||
k := strings.TrimSpace(kv[0])
|
||||
v := strings.TrimSpace(kv[1])
|
||||
v = strings.Trim(v, "\"")
|
||||
if k != "" && v != "" {
|
||||
out[k] = v
|
||||
}
|
||||
continue
|
||||
}
|
||||
} else if msgs, ok := messages["messages"].([]any); ok {
|
||||
// 2) messages 结构
|
||||
texts = extractTextFromRoleUser(msgs)
|
||||
}
|
||||
if len(out) == 0 {
|
||||
return nil
|
||||
|
||||
// 3) 构建返回结构
|
||||
return map[string]any{
|
||||
"role": "user",
|
||||
"content": strings.Join(texts, "\n"),
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// PayloadToQuery 将 payload 转为 url.Values
|
||||
func PayloadToQuery(payload map[string]any) (url.Values, error) {
|
||||
q := url.Values{}
|
||||
for k, v := range payload {
|
||||
if v == nil {
|
||||
// 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
|
||||
}
|
||||
q.Set(k, gconv.String(v))
|
||||
if role, _ := m["role"].(string); role != "user" {
|
||||
continue
|
||||
}
|
||||
texts = append(texts, extractAllText(m["content"])...)
|
||||
}
|
||||
return q, nil
|
||||
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