Files
byre/internal/agents/random.go
T

60 lines
1.8 KiB
Go

package agents
import (
"context"
"encoding/json"
"g.fc.run/ai/byre/internal/mcp"
"g.fc.run/ai/byre/internal/workflow"
)
func (m *Manager) randomChoiceTool() mcp.Tool {
return mcp.Tool{
Name: "random_choice",
Description: "Pick one of several choices at random, each with its weight as the chance of being picked, and get back the one picked. " +
"When the weights add up to less than 1, the rest is the chance that none is picked, which comes back as \"No match\". " +
"Use it whenever you are told to choose by chance, rather than choosing yourself.",
InputSchema: json.RawMessage(`{
"type": "object",
"properties": {
"choices": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"choice": {"type": "string", "description": "What this choice is, returned as it is when it is picked."},
"weight": {"type": "number", "minimum": 0, "maximum": 1, "description": "Its chance of being picked, from 0 to 1. The weights of all the choices add up to at most 1."}
},
"required": ["choice", "weight"]
}
}
},
"required": ["choices"]
}`),
Handler: mcp.TypedResult(func(ctx context.Context, args struct {
Choices []struct {
Choice string `json:"choice"`
Weight float64 `json:"weight"`
} `json:"choices"`
}) mcp.Result {
if len(args.Choices) == 0 {
return mcp.TextResult("choices is empty", true)
}
weights := []float64{}
for _, c := range args.Choices {
weights = append(weights, c.Weight)
}
p := workflow.ChoiceWeightsProblem(weights)
if p != "" {
return mcp.TextResult(p, true)
}
i := workflow.Pick(weights, 1)
if i < 0 {
return mcp.TextResult("No match: none of the choices was picked.", false)
}
return mcp.TextResult(args.Choices[i].Choice, false)
}),
}
}