mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-25 07:00:48 +09:00
70 lines
1.8 KiB
Go
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
|
|
}
|