Files
Memoh/internal/agent/tools/skill.go
T
2026-04-16 13:48:18 +08:00

70 lines
1.8 KiB
Go

package tools
import (
"context"
"errors"
"fmt"
"log/slog"
sdk "github.com/memohai/twilight-ai/sdk"
)
type SkillProvider struct {
logger *slog.Logger
}
func NewSkillProvider(log *slog.Logger) *SkillProvider {
if log == nil {
log = slog.Default()
}
return &SkillProvider{logger: log.With(slog.String("tool", "skill"))}
}
func (*SkillProvider) Tools(_ context.Context, session SessionContext) ([]sdk.Tool, error) {
if session.IsSubagent || len(session.Skills) == 0 {
return nil, nil
}
skills := session.Skills
return []sdk.Tool{
{
Name: "use_skill",
Description: "Activate a skill to get its full instructions. Call this when you think a skill is relevant to the current task.",
Parameters: map[string]any{
"type": "object",
"properties": map[string]any{
"skillName": map[string]any{
"type": "string",
"description": "The name of the skill to activate",
},
"reason": map[string]any{
"type": "string",
"description": "Why this skill is relevant to the current task",
},
},
"required": []string{"skillName", "reason"},
},
Execute: func(_ *sdk.ToolExecContext, input any) (any, error) {
args := inputAsMap(input)
skillName := StringArg(args, "skillName")
if skillName == "" {
return nil, errors.New("skillName is required")
}
skill, ok := skills[skillName]
if !ok {
return map[string]any{
"success": false,
"error": fmt.Sprintf("skill %q not found — check available skills in the system prompt", skillName),
}, nil
}
return map[string]any{
"success": true,
"skillName": skillName,
"description": skill.Description,
"content": skill.Content,
"path": skill.Path,
}, nil
},
},
}, nil
}