| 59 | } |
| 60 | |
| 61 | func (c *codeModeTool) Tools(ctx context.Context) ([]tools.Tool, error) { |
| 62 | var ( |
| 63 | functionsDoc []string |
| 64 | excludedTools []tools.Tool |
| 65 | ) |
| 66 | |
| 67 | for _, toolset := range c.toolsets { |
| 68 | allTools, err := toolset.Tools(ctx) |
| 69 | if err != nil { |
| 70 | return nil, err |
| 71 | } |
| 72 | |
| 73 | for _, tool := range allTools { |
| 74 | if isExcludedTool(tool) { |
| 75 | excludedTools = append(excludedTools, tool) |
| 76 | } else { |
| 77 | functionsDoc = append(functionsDoc, toolToJsDoc(tool)) |
| 78 | } |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | allTools := []tools.Tool{{ |
| 83 | Name: "run_tools_with_javascript", |
| 84 | Category: "code mode", |
| 85 | Description: prompt + strings.Join(functionsDoc, "\n"), |
| 86 | Parameters: tools.MustSchemaFor[RunToolsWithJavascriptArgs](), |
| 87 | Handler: tools.NewHandler(func(ctx context.Context, args RunToolsWithJavascriptArgs) (*tools.ToolCallResult, error) { |
| 88 | result, err := c.runJavascript(ctx, args.Script) |
| 89 | if err != nil { |
| 90 | return nil, err |
| 91 | } |
| 92 | |
| 93 | buf, err := json.Marshal(result) |
| 94 | if err != nil { |
| 95 | return nil, fmt.Errorf("marshaling script's result: %w", err) |
| 96 | } |
| 97 | |
| 98 | return tools.ResultSuccess(string(buf)), nil |
| 99 | }), |
| 100 | OutputSchema: tools.MustSchemaFor[ScriptResult](), |
| 101 | Annotations: tools.ToolAnnotations{ |
| 102 | Title: "Run tools with Javascript", |
| 103 | }, |
| 104 | }} |
| 105 | |
| 106 | allTools = append(allTools, excludedTools...) |
| 107 | |
| 108 | return allTools, nil |
| 109 | } |
| 110 | |
| 111 | func (c *codeModeTool) Start(ctx context.Context) error { |
| 112 | var started []tools.Startable |