48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
|
|
package chat
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"fmt"
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
guimcp "forge.lthn.ai/core/gui/pkg/mcp"
|
||
|
|
)
|
||
|
|
|
||
|
|
type exampleToolExecutor struct{}
|
||
|
|
|
||
|
|
func (exampleToolExecutor) Manifest() []guimcp.ToolDescriptor {
|
||
|
|
return []guimcp.ToolDescriptor{{
|
||
|
|
Name: "layout_suggest",
|
||
|
|
Description: "Suggest a layout",
|
||
|
|
InputSchema: map[string]any{"type": "object"},
|
||
|
|
}}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (exampleToolExecutor) ManifestText() string {
|
||
|
|
return "Available MCP tools:\n- layout_suggest: Suggest a layout"
|
||
|
|
}
|
||
|
|
|
||
|
|
func (exampleToolExecutor) CallTool(_ context.Context, name string, _ map[string]any) (string, error) {
|
||
|
|
if name == "layout_suggest" {
|
||
|
|
return `{"mode":"left-right"}`, nil
|
||
|
|
}
|
||
|
|
return "", nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func ExampleNewToolCallHandler() {
|
||
|
|
handler := NewToolCallHandler(exampleToolExecutor{})
|
||
|
|
result, err := handler.OnToolCall(context.Background(), ToolCall{
|
||
|
|
ID: "call-1",
|
||
|
|
Name: "layout_suggest",
|
||
|
|
Arguments: map[string]any{"window_count": 2},
|
||
|
|
})
|
||
|
|
|
||
|
|
fmt.Println(err == nil)
|
||
|
|
fmt.Println(result)
|
||
|
|
fmt.Println(strings.Contains(handler.BuildToolManifest(), "layout_suggest"))
|
||
|
|
// Output:
|
||
|
|
// true
|
||
|
|
// {"mode":"left-right"}
|
||
|
|
// true
|
||
|
|
}
|