| |
| package plugins |
|
|
| import ( |
| "github.com/maximhq/bifrost/core/schemas" |
| ) |
|
|
| |
| |
| type PluginConfig struct { |
| Path string `json:"path"` |
| Name string `json:"name"` |
| Enabled bool `json:"enabled"` |
| Config any `json:"config,omitempty"` |
| } |
|
|
| |
| type Config struct { |
| |
| Plugins []PluginConfig `json:"plugins"` |
| } |
|
|
| |
| |
| |
| func AsLLMPlugin(plugin schemas.BasePlugin) schemas.LLMPlugin { |
| |
| if dp, ok := plugin.(*DynamicPlugin); ok { |
| |
| if dp.preLLMHook != nil || dp.postLLMHook != nil { |
| return dp |
| } |
| return nil |
| } |
| |
| if llmPlugin, ok := plugin.(schemas.LLMPlugin); ok { |
| return llmPlugin |
| } |
| return nil |
| } |
|
|
| |
| |
| |
| func AsMCPPlugin(plugin schemas.BasePlugin) schemas.MCPPlugin { |
| |
| if dp, ok := plugin.(*DynamicPlugin); ok { |
| |
| if dp.preMCPHook != nil || dp.postMCPHook != nil { |
| return dp |
| } |
| return nil |
| } |
| |
| if mcpPlugin, ok := plugin.(schemas.MCPPlugin); ok { |
| return mcpPlugin |
| } |
| return nil |
| } |
|
|
| |
| |
| |
| func AsHTTPTransportPlugin(plugin schemas.BasePlugin) schemas.HTTPTransportPlugin { |
| |
| if dp, ok := plugin.(*DynamicPlugin); ok { |
| |
| if dp.httpTransportPreHook != nil || dp.httpTransportPostHook != nil { |
| return dp |
| } |
| return nil |
| } |
| |
| if httpPlugin, ok := plugin.(schemas.HTTPTransportPlugin); ok { |
| return httpPlugin |
| } |
| return nil |
| } |
|
|
| |
| |
| |
| func AsObservabilityPlugin(plugin schemas.BasePlugin) schemas.ObservabilityPlugin { |
| |
| if dp, ok := plugin.(*DynamicPlugin); ok { |
| |
| if dp.inject != nil { |
| return dp |
| } |
| return nil |
| } |
| |
| if obsPlugin, ok := plugin.(schemas.ObservabilityPlugin); ok { |
| return obsPlugin |
| } |
| return nil |
| } |
|
|
| |
| func LoadPlugins(loader PluginLoader, config *Config) ([]schemas.BasePlugin, error) { |
| plugins := []schemas.BasePlugin{} |
| if config == nil { |
| return plugins, nil |
| } |
|
|
| for _, pc := range config.Plugins { |
| if !pc.Enabled { |
| continue |
| } |
| plugin, err := loader.LoadPlugin(pc.Path, pc.Config) |
| if err != nil { |
| return nil, err |
| } |
| plugins = append(plugins, plugin) |
| } |
|
|
| return plugins, nil |
| } |
|
|
| |
| func FilterLLMPlugins(plugins []schemas.BasePlugin) []schemas.LLMPlugin { |
| result := []schemas.LLMPlugin{} |
| for _, p := range plugins { |
| if llmPlugin := AsLLMPlugin(p); llmPlugin != nil { |
| result = append(result, llmPlugin) |
| } |
| } |
| return result |
| } |
|
|
| |
| func FilterMCPPlugins(plugins []schemas.BasePlugin) []schemas.MCPPlugin { |
| result := []schemas.MCPPlugin{} |
| for _, p := range plugins { |
| if mcpPlugin := AsMCPPlugin(p); mcpPlugin != nil { |
| result = append(result, mcpPlugin) |
| } |
| } |
| return result |
| } |
|
|
| |
| func FilterHTTPTransportPlugins(plugins []schemas.BasePlugin) []schemas.HTTPTransportPlugin { |
| result := []schemas.HTTPTransportPlugin{} |
| for _, p := range plugins { |
| if httpPlugin := AsHTTPTransportPlugin(p); httpPlugin != nil { |
| result = append(result, httpPlugin) |
| } |
| } |
| return result |
| } |
|
|
| |
| func FilterObservabilityPlugins(plugins []schemas.BasePlugin) []schemas.ObservabilityPlugin { |
| result := []schemas.ObservabilityPlugin{} |
| for _, p := range plugins { |
| if obsPlugin := AsObservabilityPlugin(p); obsPlugin != nil { |
| result = append(result, obsPlugin) |
| } |
| } |
| return result |
| } |
|
|