@@ -33,6 +33,7 @@ import (
3333 "github.com/fsnotify/fsnotify"
3434 yaml "github.com/goccy/go-yaml"
3535 "github.com/googleapis/genai-toolbox/internal/auth"
36+ "github.com/googleapis/genai-toolbox/internal/embeddingmodels"
3637 "github.com/googleapis/genai-toolbox/internal/log"
3738 "github.com/googleapis/genai-toolbox/internal/prebuiltconfigs"
3839 "github.com/googleapis/genai-toolbox/internal/prompts"
@@ -385,12 +386,13 @@ func NewCommand(opts ...Option) *Command {
385386}
386387
387388type ToolsFile struct {
388- Sources server.SourceConfigs `yaml:"sources"`
389- AuthSources server.AuthServiceConfigs `yaml:"authSources"` // Deprecated: Kept for compatibility.
390- AuthServices server.AuthServiceConfigs `yaml:"authServices"`
391- Tools server.ToolConfigs `yaml:"tools"`
392- Toolsets server.ToolsetConfigs `yaml:"toolsets"`
393- Prompts server.PromptConfigs `yaml:"prompts"`
389+ Sources server.SourceConfigs `yaml:"sources"`
390+ AuthSources server.AuthServiceConfigs `yaml:"authSources"` // Deprecated: Kept for compatibility.
391+ AuthServices server.AuthServiceConfigs `yaml:"authServices"`
392+ EmbeddingModels server.EmbeddingModelConfigs `yaml:"embeddingModels"`
393+ Tools server.ToolConfigs `yaml:"tools"`
394+ Toolsets server.ToolsetConfigs `yaml:"toolsets"`
395+ Prompts server.PromptConfigs `yaml:"prompts"`
394396}
395397
396398// parseEnv replaces environment variables ${ENV_NAME} with their values.
@@ -439,11 +441,12 @@ func parseToolsFile(ctx context.Context, raw []byte) (ToolsFile, error) {
439441// All resource names (sources, authServices, tools, toolsets) must be unique across all files.
440442func mergeToolsFiles (files ... ToolsFile ) (ToolsFile , error ) {
441443 merged := ToolsFile {
442- Sources : make (server.SourceConfigs ),
443- AuthServices : make (server.AuthServiceConfigs ),
444- Tools : make (server.ToolConfigs ),
445- Toolsets : make (server.ToolsetConfigs ),
446- Prompts : make (server.PromptConfigs ),
444+ Sources : make (server.SourceConfigs ),
445+ AuthServices : make (server.AuthServiceConfigs ),
446+ EmbeddingModels : make (server.EmbeddingModelConfigs ),
447+ Tools : make (server.ToolConfigs ),
448+ Toolsets : make (server.ToolsetConfigs ),
449+ Prompts : make (server.PromptConfigs ),
447450 }
448451
449452 var conflicts []string
@@ -479,6 +482,15 @@ func mergeToolsFiles(files ...ToolsFile) (ToolsFile, error) {
479482 }
480483 }
481484
485+ // Check for conflicts and merge embeddingModels
486+ for name , model := range file .EmbeddingModels {
487+ if _ , exists := merged .EmbeddingModels [name ]; exists {
488+ conflicts = append (conflicts , fmt .Sprintf ("embedding model '%s' (file #%d)" , name , fileIndex + 1 ))
489+ } else {
490+ merged .EmbeddingModels [name ] = model
491+ }
492+ }
493+
482494 // Check for conflicts and merge tools
483495 for name , tool := range file .Tools {
484496 if _ , exists := merged .Tools [name ]; exists {
@@ -583,22 +595,22 @@ func handleDynamicReload(ctx context.Context, toolsFile ToolsFile, s *server.Ser
583595 panic (err )
584596 }
585597
586- sourcesMap , authServicesMap , toolsMap , toolsetsMap , promptsMap , promptsetsMap , err := validateReloadEdits (ctx , toolsFile )
598+ sourcesMap , authServicesMap , embeddingModelsMap , toolsMap , toolsetsMap , promptsMap , promptsetsMap , err := validateReloadEdits (ctx , toolsFile )
587599 if err != nil {
588600 errMsg := fmt .Errorf ("unable to validate reloaded edits: %w" , err )
589601 logger .WarnContext (ctx , errMsg .Error ())
590602 return err
591603 }
592604
593- s .ResourceMgr .SetResources (sourcesMap , authServicesMap , toolsMap , toolsetsMap , promptsMap , promptsetsMap )
605+ s .ResourceMgr .SetResources (sourcesMap , authServicesMap , embeddingModelsMap , toolsMap , toolsetsMap , promptsMap , promptsetsMap )
594606
595607 return nil
596608}
597609
598610// validateReloadEdits checks that the reloaded tools file configs can initialized without failing
599611func validateReloadEdits (
600612 ctx context.Context , toolsFile ToolsFile ,
601- ) (map [string ]sources.Source , map [string ]auth.AuthService , map [string ]tools.Tool , map [string ]tools.Toolset , map [string ]prompts.Prompt , map [string ]prompts.Promptset , error ,
613+ ) (map [string ]sources.Source , map [string ]auth.AuthService , map [string ]embeddingmodels. EmbeddingModel , map [ string ] tools.Tool , map [string ]tools.Toolset , map [string ]prompts.Prompt , map [string ]prompts.Promptset , error ,
602614) {
603615 logger , err := util .LoggerFromContext (ctx )
604616 if err != nil {
@@ -616,22 +628,23 @@ func validateReloadEdits(
616628 defer span .End ()
617629
618630 reloadedConfig := server.ServerConfig {
619- Version : versionString ,
620- SourceConfigs : toolsFile .Sources ,
621- AuthServiceConfigs : toolsFile .AuthServices ,
622- ToolConfigs : toolsFile .Tools ,
623- ToolsetConfigs : toolsFile .Toolsets ,
624- PromptConfigs : toolsFile .Prompts ,
631+ Version : versionString ,
632+ SourceConfigs : toolsFile .Sources ,
633+ AuthServiceConfigs : toolsFile .AuthServices ,
634+ EmbeddingModelConfigs : toolsFile .EmbeddingModels ,
635+ ToolConfigs : toolsFile .Tools ,
636+ ToolsetConfigs : toolsFile .Toolsets ,
637+ PromptConfigs : toolsFile .Prompts ,
625638 }
626639
627- sourcesMap , authServicesMap , toolsMap , toolsetsMap , promptsMap , promptsetsMap , err := server .InitializeConfigs (ctx , reloadedConfig )
640+ sourcesMap , authServicesMap , embeddingModelsMap , toolsMap , toolsetsMap , promptsMap , promptsetsMap , err := server .InitializeConfigs (ctx , reloadedConfig )
628641 if err != nil {
629642 errMsg := fmt .Errorf ("unable to initialize reloaded configs: %w" , err )
630643 logger .WarnContext (ctx , errMsg .Error ())
631- return nil , nil , nil , nil , nil , nil , err
644+ return nil , nil , nil , nil , nil , nil , nil , err
632645 }
633646
634- return sourcesMap , authServicesMap , toolsMap , toolsetsMap , promptsMap , promptsetsMap , nil
647+ return sourcesMap , authServicesMap , embeddingModelsMap , toolsMap , toolsetsMap , promptsMap , promptsetsMap , nil
635648}
636649
637650// watchChanges checks for changes in the provided yaml tools file(s) or folder.
0 commit comments