feat: integrar skills en runtime de agentes
Integrar sistema de skills en agents/runtime.go: - Agregar skillLoader al struct Agent - Inicializar loader y executor cuando skills.enabled = true - Registrar skill tools en buildToolRegistry - Respetar filtro de categorias configurado - Aplicar timeout configurado para scripts Las skills quedan disponibles automaticamente para agentes que las habiliten en su config YAML. Arquitectura: skills como extension opcional, no dependencia core.
This commit is contained in:
+40
-1
@@ -31,6 +31,7 @@ import (
|
|||||||
"github.com/enmanuel/agents/shell/matrix"
|
"github.com/enmanuel/agents/shell/matrix"
|
||||||
shellmcp "github.com/enmanuel/agents/shell/mcp"
|
shellmcp "github.com/enmanuel/agents/shell/mcp"
|
||||||
shellmem "github.com/enmanuel/agents/shell/memory"
|
shellmem "github.com/enmanuel/agents/shell/memory"
|
||||||
|
shellskills "github.com/enmanuel/agents/shell/skills"
|
||||||
"github.com/enmanuel/agents/shell/ssh"
|
"github.com/enmanuel/agents/shell/ssh"
|
||||||
"github.com/enmanuel/agents/tools"
|
"github.com/enmanuel/agents/tools"
|
||||||
toolclock "github.com/enmanuel/agents/tools/clock"
|
toolclock "github.com/enmanuel/agents/tools/clock"
|
||||||
@@ -40,6 +41,7 @@ import (
|
|||||||
toolmatrix "github.com/enmanuel/agents/tools/matrix"
|
toolmatrix "github.com/enmanuel/agents/tools/matrix"
|
||||||
toolmcp "github.com/enmanuel/agents/tools/mcptools"
|
toolmcp "github.com/enmanuel/agents/tools/mcptools"
|
||||||
toolmemory "github.com/enmanuel/agents/tools/memorytools"
|
toolmemory "github.com/enmanuel/agents/tools/memorytools"
|
||||||
|
toolskills "github.com/enmanuel/agents/tools/skilltools"
|
||||||
toolssh "github.com/enmanuel/agents/tools/ssh"
|
toolssh "github.com/enmanuel/agents/tools/ssh"
|
||||||
toolweather "github.com/enmanuel/agents/tools/weather"
|
toolweather "github.com/enmanuel/agents/tools/weather"
|
||||||
)
|
)
|
||||||
@@ -95,6 +97,9 @@ type Agent struct {
|
|||||||
// Shared knowledge store — non-nil when shared_knowledge is enabled
|
// Shared knowledge store — non-nil when shared_knowledge is enabled
|
||||||
sharedKnowledgeStore *shellknowledge.FileStore
|
sharedKnowledgeStore *shellknowledge.FileStore
|
||||||
|
|
||||||
|
// Skills loader — non-nil when skills are enabled
|
||||||
|
skillLoader *shellskills.Loader
|
||||||
|
|
||||||
// Sanitization options — nil when sanitization is disabled
|
// Sanitization options — nil when sanitization is disabled
|
||||||
sanitizeOpts *sanitize.Options
|
sanitizeOpts *sanitize.Options
|
||||||
|
|
||||||
@@ -277,8 +282,28 @@ func New(cfg *config.AgentConfig, rules []decision.Rule, agentACL acl.ACL, logge
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Skills loader
|
||||||
|
var skillLoader *shellskills.Loader
|
||||||
|
var skillExecutor *shellskills.Executor
|
||||||
|
if cfg.Skills.Enabled {
|
||||||
|
skillsPath := cfg.Skills.SkillsPath
|
||||||
|
if skillsPath == "" {
|
||||||
|
skillsPath = "skills/"
|
||||||
|
}
|
||||||
|
skillLoader = shellskills.NewLoader(skillsPath)
|
||||||
|
|
||||||
|
// Skills executor for scripts
|
||||||
|
allowedInterpreters := cfg.Tools.Skills.AllowedInterpreters
|
||||||
|
timeout := cfg.Skills.Timeout
|
||||||
|
if timeout == 0 {
|
||||||
|
timeout = 60 * time.Second
|
||||||
|
}
|
||||||
|
skillExecutor = shellskills.NewExecutor(allowedInterpreters, timeout)
|
||||||
|
logger.Info("skills enabled", "path", skillsPath, "categories", cfg.Skills.Categories)
|
||||||
|
}
|
||||||
|
|
||||||
// Tool registry — register tools enabled in config
|
// Tool registry — register tools enabled in config
|
||||||
toolReg := buildToolRegistry(cfg, sshExec, matrixClient, memStore, kStore, sharedKStore, mcpManager, roomCtx, logger)
|
toolReg := buildToolRegistry(cfg, sshExec, matrixClient, memStore, kStore, sharedKStore, mcpManager, skillLoader, skillExecutor, roomCtx, logger)
|
||||||
|
|
||||||
// Rate limiting for tools
|
// Rate limiting for tools
|
||||||
if cfg.Security.ToolRateLimit.Enabled {
|
if cfg.Security.ToolRateLimit.Enabled {
|
||||||
@@ -322,6 +347,7 @@ func New(cfg *config.AgentConfig, rules []decision.Rule, agentACL acl.ACL, logge
|
|||||||
memStore: memStore,
|
memStore: memStore,
|
||||||
knowledgeStore: kStore,
|
knowledgeStore: kStore,
|
||||||
sharedKnowledgeStore: sharedKStore,
|
sharedKnowledgeStore: sharedKStore,
|
||||||
|
skillLoader: skillLoader,
|
||||||
windowSize: windowSize,
|
windowSize: windowSize,
|
||||||
roomCtx: roomCtx,
|
roomCtx: roomCtx,
|
||||||
}
|
}
|
||||||
@@ -1031,6 +1057,8 @@ func buildToolRegistry(
|
|||||||
kStore *shellknowledge.FileStore,
|
kStore *shellknowledge.FileStore,
|
||||||
sharedKStore *shellknowledge.FileStore,
|
sharedKStore *shellknowledge.FileStore,
|
||||||
mcpManager *shellmcp.Manager,
|
mcpManager *shellmcp.Manager,
|
||||||
|
skillLoader *shellskills.Loader,
|
||||||
|
skillExecutor *shellskills.Executor,
|
||||||
roomCtx *toolmemory.RoomContext,
|
roomCtx *toolmemory.RoomContext,
|
||||||
logger *slog.Logger,
|
logger *slog.Logger,
|
||||||
) *tools.Registry {
|
) *tools.Registry {
|
||||||
@@ -1116,5 +1144,16 @@ func buildToolRegistry(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Skills tools — register skill search, load, read, and run tools
|
||||||
|
if skillLoader != nil {
|
||||||
|
reg.Register(toolskills.NewSkillSearch(skillLoader, cfg.Skills.Categories))
|
||||||
|
reg.Register(toolskills.NewSkillLoad(skillLoader))
|
||||||
|
reg.Register(toolskills.NewSkillReadResource(skillLoader))
|
||||||
|
if skillExecutor != nil {
|
||||||
|
reg.Register(toolskills.NewSkillRunScript(skillLoader, skillExecutor))
|
||||||
|
}
|
||||||
|
logger.Debug("registered skills tools")
|
||||||
|
}
|
||||||
|
|
||||||
return reg
|
return reg
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user