Merge pull request #845 from trheyi/main

Add connector settings support in DSL and assistant initialization
This commit is contained in:
Max 2025-02-01 17:45:44 +08:00 committed by GitHub
commit 2e8a13033e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 99 additions and 43 deletions

View file

@ -471,13 +471,15 @@ func (ast *Assistant) withOptions(options map[string]interface{}) map[string]int
} }
} }
// Add tools // Add tool_calls
if ast.Tools != nil && len(ast.Tools) > 0 { if ast.Tools != nil && ast.Tools.Tools != nil && len(ast.Tools.Tools) > 0 {
options["tools"] = ast.Tools if settings, has := connectorSettings[ast.Connector]; has && settings.Tools {
options["tools"] = ast.Tools.Tools
if options["tool_choice"] == nil { if options["tool_choice"] == nil {
options["tool_choice"] = "auto" options["tool_choice"] = "auto"
} }
} }
}
return options return options
} }
@ -492,6 +494,22 @@ func (ast *Assistant) withPrompts(messages []chatMessage.Message) []chatMessage.
messages = append(messages, *chatMessage.New().Map(map[string]interface{}{"role": prompt.Role, "content": prompt.Content, "name": name})) messages = append(messages, *chatMessage.New().Map(map[string]interface{}{"role": prompt.Role, "content": prompt.Content, "name": name}))
} }
} }
// Add tool_calls
if ast.Tools != nil && ast.Tools.Tools != nil && len(ast.Tools.Tools) > 0 {
if settings, has := connectorSettings[ast.Connector]; has && !settings.Tools {
if ast.Tools.Prompts != nil && len(ast.Tools.Prompts) > 0 {
for _, prompt := range ast.Tools.Prompts {
messages = append(messages, *chatMessage.New().Map(map[string]interface{}{
"role": prompt.Role,
"content": prompt.Content,
"name": prompt.Name,
}))
}
}
}
}
return messages return messages
} }

View file

@ -201,8 +201,16 @@ func (ast *Assistant) Clone() *Assistant {
// Deep copy tools // Deep copy tools
if ast.Tools != nil { if ast.Tools != nil {
clone.Tools = make([]Tool, len(ast.Tools)) clone.Tools = &ToolCalls{}
copy(clone.Tools, ast.Tools) if ast.Tools.Tools != nil {
clone.Tools.Tools = make([]Tool, len(ast.Tools.Tools))
copy(clone.Tools.Tools, ast.Tools.Tools)
}
if ast.Tools.Prompts != nil {
clone.Tools.Prompts = make([]Prompt, len(ast.Tools.Prompts))
copy(clone.Tools.Prompts, ast.Tools.Prompts)
}
} }
// Deep copy flows // Deep copy flows
@ -242,13 +250,20 @@ func (ast *Assistant) Update(data map[string]interface{}) error {
if v, has := data["tools"]; has { if v, has := data["tools"]; has {
switch tools := v.(type) { switch tools := v.(type) {
case []Tool: case []Tool:
ast.Tools = &ToolCalls{
Tools: tools,
Prompts: ast.Prompts,
}
case *ToolCalls:
ast.Tools = tools ast.Tools = tools
default: default:
raw, err := jsoniter.Marshal(tools) raw, err := jsoniter.Marshal(tools)
if err != nil { if err != nil {
return err return err
} }
ast.Tools = []Tool{} ast.Tools = &ToolCalls{}
err = jsoniter.Unmarshal(raw, &ast.Tools) err = jsoniter.Unmarshal(raw, &ast.Tools)
if err != nil { if err != nil {
return err return err

View file

@ -25,6 +25,7 @@ import (
var loaded = NewCache(200) // 200 is the default capacity var loaded = NewCache(200) // 200 is the default capacity
var storage store.Store = nil var storage store.Store = nil
var rag *RAG = nil var rag *RAG = nil
var connectorSettings map[string]ConnectorSetting = map[string]ConnectorSetting{}
var vision *neovision.Vision = nil var vision *neovision.Vision = nil
var defaultConnector string = "" // default connector var defaultConnector string = "" // default connector
@ -124,6 +125,11 @@ func SetVision(v *neovision.Vision) {
vision = v vision = v
} }
// SetConnectorSettings set the connector settings
func SetConnectorSettings(settings map[string]ConnectorSetting) {
connectorSettings = settings
}
// SetConnector set the connector // SetConnector set the connector
func SetConnector(c string) { func SetConnector(c string) {
defaultConnector = c defaultConnector = c
@ -443,7 +449,13 @@ func loadMap(data map[string]interface{}) (*Assistant, error) {
if tools, has := data["tools"]; has { if tools, has := data["tools"]; has {
switch vv := tools.(type) { switch vv := tools.(type) {
case []Tool: case []Tool:
assistant.Tools = vv assistant.Tools = &ToolCalls{
Tools: vv,
Prompts: assistant.Prompts,
}
case ToolCalls:
assistant.Tools = &vv
default: default:
raw, err := jsoniter.Marshal(tools) raw, err := jsoniter.Marshal(tools)
@ -451,12 +463,12 @@ func loadMap(data map[string]interface{}) (*Assistant, error) {
return nil, fmt.Errorf("tools format error %s", err.Error()) return nil, fmt.Errorf("tools format error %s", err.Error())
} }
var tools []Tool var tools ToolCalls
err = jsoniter.Unmarshal(raw, &tools) err = jsoniter.Unmarshal(raw, &tools)
if err != nil { if err != nil {
return nil, fmt.Errorf("tools format error %s", err.Error()) return nil, fmt.Errorf("tools format error %s", err.Error())
} }
assistant.Tools = tools assistant.Tools = &tools
} }
} }
@ -605,7 +617,7 @@ func (ast *Assistant) initialize() error {
return nil return nil
} }
func loadTools(file string) ([]Tool, int64, error) { func loadTools(file string) (*ToolCalls, int64, error) {
app, err := fs.Get("app") app, err := fs.Get("app")
if err != nil { if err != nil {
@ -623,14 +635,14 @@ func loadTools(file string) ([]Tool, int64, error) {
} }
if len(content) == 0 { if len(content) == 0 {
return []Tool{}, ts.UnixNano(), nil return &ToolCalls{Tools: []Tool{}, Prompts: []Prompt{}}, ts.UnixNano(), nil
} }
var tools []Tool var tools ToolCalls
err = jsoniter.Unmarshal(content, &tools) err = application.Parse(file, content, &tools)
if err != nil { if err != nil {
return nil, 0, err return nil, 0, err
} }
return tools, ts.UnixNano(), nil return &tools, ts.UnixNano(), nil
} }

View file

@ -129,7 +129,7 @@ type Assistant struct {
Automated bool `json:"automated,omitempty"` // Whether this assistant is automated Automated bool `json:"automated,omitempty"` // Whether this assistant is automated
Options map[string]interface{} `json:"options,omitempty"` // AI Options Options map[string]interface{} `json:"options,omitempty"` // AI Options
Prompts []Prompt `json:"prompts,omitempty"` // AI Prompts Prompts []Prompt `json:"prompts,omitempty"` // AI Prompts
Tools []Tool `json:"tools,omitempty"` // Assistant Tools Tools *ToolCalls `json:"tools,omitempty"` // Assistant Tools
Flows []map[string]interface{} `json:"flows,omitempty"` // Assistant Flows Flows []map[string]interface{} `json:"flows,omitempty"` // Assistant Flows
Placeholder *Placeholder `json:"placeholder,omitempty"` // Assistant Placeholder Placeholder *Placeholder `json:"placeholder,omitempty"` // Assistant Placeholder
Script *v8.Script `json:"-" yaml:"-"` // Assistant Script Script *v8.Script `json:"-" yaml:"-"` // Assistant Script
@ -137,9 +137,22 @@ type Assistant struct {
UpdatedAt int64 `json:"updated_at"` // Last update timestamp UpdatedAt int64 `json:"updated_at"` // Last update timestamp
openai *api.OpenAI // OpenAI API openai *api.OpenAI // OpenAI API
vision bool // Whether this assistant supports vision vision bool // Whether this assistant supports vision
toolCalls bool // Whether this assistant supports tool_calls
initHook bool // Whether this assistant has an init hook initHook bool // Whether this assistant has an init hook
} }
// ToolCalls the tool calls
type ToolCalls struct {
Tools []Tool `json:"tools,omitempty"`
Prompts []Prompt `json:"prompts,omitempty"`
}
// ConnectorSetting the connector setting
type ConnectorSetting struct {
Vision bool `json:"vision,omitempty" yaml:"vision,omitempty"`
Tools bool `json:"tools,omitempty" yaml:"tools,omitempty"`
}
// Placeholder the assistant placeholder // Placeholder the assistant placeholder
type Placeholder struct { type Placeholder struct {
Title string `json:"title,omitempty"` Title string `json:"title,omitempty"`

View file

@ -160,6 +160,10 @@ func initAssistant() error {
assistant.SetVision(Neo.Vision) assistant.SetVision(Neo.Vision)
} }
if Neo.Connectors != nil {
assistant.SetConnectorSettings(Neo.Connectors)
}
// Default Connector // Default Connector
assistant.SetConnector(Neo.Connector) assistant.SetConnector(Neo.Connector)

View file

@ -26,18 +26,12 @@ type DSL struct {
Write string `json:"write,omitempty" yaml:"write,omitempty"` Write string `json:"write,omitempty" yaml:"write,omitempty"`
Prompts []assistant.Prompt `json:"prompts,omitempty" yaml:"prompts,omitempty"` Prompts []assistant.Prompt `json:"prompts,omitempty" yaml:"prompts,omitempty"`
Allows []string `json:"allows,omitempty" yaml:"allows,omitempty"` Allows []string `json:"allows,omitempty" yaml:"allows,omitempty"`
Connectors map[string]assistant.ConnectorSetting `json:"connectors,omitempty" yaml:"connectors,omitempty"`
Assistant assistant.API `json:"-" yaml:"-"` // The default assistant Assistant assistant.API `json:"-" yaml:"-"` // The default assistant
Store store.Store `json:"-" yaml:"-"` Store store.Store `json:"-" yaml:"-"`
RAG *rag.RAG `json:"-" yaml:"-"` RAG *rag.RAG `json:"-" yaml:"-"`
Vision *vision.Vision `json:"-" yaml:"-"` Vision *vision.Vision `json:"-" yaml:"-"`
GuardHandlers []gin.HandlerFunc `json:"-" yaml:"-"` GuardHandlers []gin.HandlerFunc `json:"-" yaml:"-"`
Connectors map[string]ConnectorSetting `json:"-" yaml:"-"`
}
// ConnectorSetting the connector setting
type ConnectorSetting struct {
Vision bool `json:"vision,omitempty" yaml:"vision,omitempty"`
Tools bool `json:"tools,omitempty" yaml:"tools,omitempty"`
} }
// VisionSetting the vision setting // VisionSetting the vision setting