From 54e946c61d847169dce32236e65360fdbd74d8a2 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 31 Jan 2025 11:02:31 +0800 Subject: [PATCH] Add support for field selection in assistant filtering - Implemented `select` parameter parsing in `parseAssistantFilter` - Added support for selecting fields via string, string array, or interface array - Enhanced `neo/process.go` to handle flexible field selection - Improved error handling in stream chat processing - Fixed function message handling in message appending --- neo/assistant/api.go | 7 +++++++ neo/message/message.go | 6 +++++- neo/process.go | 24 ++++++++++++++++++++++++ share/utils.go | 23 ++++++++++++++++++----- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/neo/assistant/api.go b/neo/assistant/api.go index 92f2530f..46617319 100644 --- a/neo/assistant/api.go +++ b/neo/assistant/api.go @@ -377,6 +377,13 @@ func (ast *Assistant) streamChat( Write(c.Writer) } + // Hook execute error + if hookErr != nil { + chatMessage.New().Error(hookErr.Error()).Done().Write(c.Writer) + done <- true + return 0 // break + } + // Output if res.Output != nil { chatMessage.New(). diff --git a/neo/message/message.go b/neo/message/message.go index 80e0001c..3b8d3dba 100644 --- a/neo/message/message.go +++ b/neo/message/message.go @@ -332,8 +332,10 @@ func (m *Message) AppendTo(contents *Contents) *Message { case "tool_calls": // Set function name + new := false if name, ok := m.Props["function"].(string); ok && name != "" { contents.NewFunction(name, []byte(m.Text)) + new = true } // Set id @@ -341,7 +343,9 @@ func (m *Message) AppendTo(contents *Contents) *Message { contents.SetFunctionID(id) } - contents.AppendFunction([]byte(m.Text)) + if !new { + contents.AppendFunction([]byte(m.Text)) + } return m case "loading", "error", "action": // Ignore loading, action and error messages diff --git a/neo/process.go b/neo/process.go index 3168d66f..79a377cf 100644 --- a/neo/process.go +++ b/neo/process.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "strconv" + "strings" "github.com/gin-gonic/gin" "github.com/yaoapp/gou/process" @@ -295,6 +296,29 @@ func parseAssistantFilter(params map[string]interface{}) store.AssistantFilter { } } + // select + if sel, ok := params["select"]; ok { + switch v := sel.(type) { + case []interface{}: + filter.Select = []string{} + for _, field := range v { + switch field.(type) { + case string: + filter.Select = append(filter.Select, field.(string)) + case interface{}: + filter.Select = append(filter.Select, fmt.Sprintf("%v", field)) + } + } + + case []string: + filter.Select = v + + case string: + fields := strings.Split(v, ",") + filter.Select = fields + } + } + // Parse tags if tags, ok := params["tags"]; ok { switch v := tags.(type) { diff --git a/share/utils.go b/share/utils.go index 98ec8d25..b753d7fc 100644 --- a/share/utils.go +++ b/share/utils.go @@ -45,11 +45,24 @@ func File(id string, ext string) string { // SpecName 解析名称 root: "/tests/apis" file: "/tests/apis/foo/bar.http.json" func SpecName(root string, file string) string { - filename := strings.TrimPrefix(file, root+"/") // "foo/bar.http.json" - namer := strings.Split(filename, ".") // ["foo/bar", "http", "json"] - nametypes := strings.Split(namer[0], "/") // ["foo", "bar"] - name := strings.Join(nametypes, ".") // "foo.bar" - return name + filename := strings.TrimPrefix(file, root+"/") // "foo/bar.http.json", "foo/bar2.0.http.json" + parts := strings.Split(filename, "/") // ["foo", "bar.http.json"], ["foo", "bar2.0.http.json"] + basename := parts[len(parts)-1] // "bar.http.json", "bar2.0.http.json" + paths := parts[:len(parts)-1] // ["foo"], ["foo"] + for i, path := range paths { + paths[i] = strings.ReplaceAll(path, ".", "_") // ["foo"], ["foo"] + } + names := strings.Split(basename, ".") // ["bar", "http", "json"], ["bar2", "0", "http", "json"] + namelen := len(names) + extcnt := 1 + if names[namelen-1] == "yao" || names[namelen-1] == "json" || names[namelen-1] == "jsonc" { + extcnt = 2 + } + names = names[:len(names)-extcnt] // ["bar"], ["bar2", "0"] + basename = strings.Join(names, ".") // "bar", "bar2.0" + basename = strings.ReplaceAll(basename, ".", "_") // "bar", "bar2_0" + paths = append(paths, basename) // ["foo", "bar"], ["foo", "bar2_0"] + return strings.Join(paths, ".") // "foo.bar", "foo.bar2_0" } // ScriptName 解析数据处理脚本名称