on main help sign in
fix(tools): drastically reduce tool call description lengths
commitf78baed0f06e40a3be64d21c69422ef8a6def832 authorChristian Rocha <christian@rocha.is> dateWed 8 Apr 2026, 14:49 (6 months ago) parente23ef33
23 files changed+37−22
internal/agent/agent_tool.go+1−1 internal/agent/agentic_fetch_tool.go+1−1 internal/agent/tools/diagnostics.go+1−1 internal/agent/tools/download.go+1−1 internal/agent/tools/edit.go+1−1 internal/agent/tools/fetch.go+1−1 internal/agent/tools/glob.go+1−1 internal/agent/tools/grep.go+1−1 internal/agent/tools/job_kill.go+1−1 internal/agent/tools/job_output.go+1−1 internal/agent/tools/list_mcp_resources.go+1−1 internal/agent/tools/ls.go+1−1 internal/agent/tools/lsp_restart.go+1−1 internal/agent/tools/multiedit.go+1−1 internal/agent/tools/read_mcp_resource.go+1−1 internal/agent/tools/references.go+1−1 internal/agent/tools/sourcegraph.go+1−1 internal/agent/tools/todos.go+1−1 internal/agent/tools/tools.go+15 internal/agent/tools/view.go+1−1 internal/agent/tools/web_fetch.go+1−1 internal/agent/tools/web_search.go+1−1 internal/agent/tools/write.go+1−1
internal/agent/agent_tool.go+1−1
@@ -39,7 +39,7 @@ func (c *coordinator) agentTool(ctx context.Context) (fantasy.AgentTool, error)
3939 }
4040 return fantasy.NewParallelAgentTool(
4141 AgentToolName,
42− string(agentToolDescription),
42+ tools.FirstLineDescription(agentToolDescription),
4343 func(ctx context.Context, params AgentParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
4444 if params.Prompt == "" {
4545 return fantasy.NewTextErrorResponse("prompt is required"), nil
internal/agent/agentic_fetch_tool.go+1−1
@@ -65,7 +65,7 @@ func (c *coordinator) agenticFetchTool(_ context.Context, client *http.Client) (
6565
6666 return fantasy.NewParallelAgentTool(
6767 tools.AgenticFetchToolName,
68− string(agenticFetchToolDescription),
68+ tools.FirstLineDescription(agenticFetchToolDescription),
6969 func(ctx context.Context, params tools.AgenticFetchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
7070 validationResult, err := validateAgenticFetchParams(ctx, params)
7171 if err != nil {
internal/agent/tools/diagnostics.go+1−1
@@ -27,7 +27,7 @@ var diagnosticsDescription []byte
2727func NewDiagnosticsTool(lspManager *lsp.Manager) fantasy.AgentTool {
2828 return fantasy.NewAgentTool(
2929 DiagnosticsToolName,
30− string(diagnosticsDescription),
30+ FirstLineDescription(diagnosticsDescription),
3131 func(ctx context.Context, params DiagnosticsParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3232 if lspManager.Clients().Len() == 0 {
3333 return fantasy.NewTextErrorResponse("no LSP clients available"), nil
internal/agent/tools/download.go+1−1
@@ -48,7 +48,7 @@ func NewDownloadTool(permissions permission.Service, workingDir string, client *
4848 }
4949 return fantasy.NewParallelAgentTool(
5050 DownloadToolName,
51− string(downloadDescription),
51+ FirstLineDescription(downloadDescription),
5252 func(ctx context.Context, params DownloadParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
5353 if params.URL == "" {
5454 return fantasy.NewTextErrorResponse("URL parameter is required"), nil
internal/agent/tools/edit.go+1−1
@@ -68,7 +68,7 @@ func NewEditTool(
6868) fantasy.AgentTool {
6969 return fantasy.NewAgentTool(
7070 EditToolName,
71− string(editDescription),
71+ FirstLineDescription(editDescription),
7272 func(ctx context.Context, params EditParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
7373 if params.FilePath == "" {
7474 return fantasy.NewTextErrorResponse("file_path is required"), nil
internal/agent/tools/fetch.go+1−1
@@ -39,7 +39,7 @@ func NewFetchTool(permissions permission.Service, workingDir string, client *htt
3939
4040 return fantasy.NewParallelAgentTool(
4141 FetchToolName,
42− string(fetchDescription),
42+ FirstLineDescription(fetchDescription),
4343 func(ctx context.Context, params FetchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
4444 if params.URL == "" {
4545 return fantasy.NewTextErrorResponse("URL parameter is required"), nil
internal/agent/tools/glob.go+1−1
@@ -34,7 +34,7 @@ type GlobResponseMetadata struct {
3434func NewGlobTool(workingDir string) fantasy.AgentTool {
3535 return fantasy.NewAgentTool(
3636 GlobToolName,
37− string(globDescription),
37+ FirstLineDescription(globDescription),
3838 func(ctx context.Context, params GlobParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3939 if params.Pattern == "" {
4040 return fantasy.NewTextErrorResponse("pattern is required"), nil
internal/agent/tools/grep.go+1−1
@@ -105,7 +105,7 @@ func escapeRegexPattern(pattern string) string {
105105func NewGrepTool(workingDir string, config config.ToolGrep) fantasy.AgentTool {
106106 return fantasy.NewAgentTool(
107107 GrepToolName,
108− string(grepDescription),
108+ FirstLineDescription(grepDescription),
109109 func(ctx context.Context, params GrepParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
110110 if params.Pattern == "" {
111111 return fantasy.NewTextErrorResponse("pattern is required"), nil
internal/agent/tools/job_kill.go+1−1
@@ -29,7 +29,7 @@ type JobKillResponseMetadata struct {
2929func NewJobKillTool() fantasy.AgentTool {
3030 return fantasy.NewAgentTool(
3131 JobKillToolName,
32− string(jobKillDescription),
32+ FirstLineDescription(jobKillDescription),
3333 func(ctx context.Context, params JobKillParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3434 if params.ShellID == "" {
3535 return fantasy.NewTextErrorResponse("missing shell_id"), nil
internal/agent/tools/job_output.go+1−1
@@ -33,7 +33,7 @@ type JobOutputResponseMetadata struct {
3333func NewJobOutputTool() fantasy.AgentTool {
3434 return fantasy.NewAgentTool(
3535 JobOutputToolName,
36− string(jobOutputDescription),
36+ FirstLineDescription(jobOutputDescription),
3737 func(ctx context.Context, params JobOutputParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3838 if params.ShellID == "" {
3939 return fantasy.NewTextErrorResponse("missing shell_id"), nil
internal/agent/tools/list_mcp_resources.go+1−1
@@ -31,7 +31,7 @@ var listMCPResourcesDescription []byte
3131func NewListMCPResourcesTool(cfg *config.ConfigStore, permissions permission.Service) fantasy.AgentTool {
3232 return fantasy.NewParallelAgentTool(
3333 ListMCPResourcesToolName,
34− string(listMCPResourcesDescription),
34+ FirstLineDescription(listMCPResourcesDescription),
3535 func(ctx context.Context, params ListMCPResourcesParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3636 params.MCPName = strings.TrimSpace(params.MCPName)
3737 if params.MCPName == "" {
internal/agent/tools/ls.go+1−1
@@ -58,7 +58,7 @@ var lsDescription []byte
5858func NewLsTool(permissions permission.Service, workingDir string, lsConfig config.ToolLs) fantasy.AgentTool {
5959 return fantasy.NewAgentTool(
6060 LSToolName,
61− string(lsDescription),
61+ FirstLineDescription(lsDescription),
6262 func(ctx context.Context, params LSParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
6363 searchPath, err := fsext.Expand(cmp.Or(params.Path, workingDir))
6464 if err != nil {
internal/agent/tools/lsp_restart.go+1−1
@@ -27,7 +27,7 @@ type LSPRestartParams struct {
2727func NewLSPRestartTool(lspManager *lsp.Manager) fantasy.AgentTool {
2828 return fantasy.NewAgentTool(
2929 LSPRestartToolName,
30− string(lspRestartDescription),
30+ FirstLineDescription(lspRestartDescription),
3131 func(ctx context.Context, params LSPRestartParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3232 if lspManager.Clients().Len() == 0 {
3333 return fantasy.NewTextErrorResponse("no LSP clients available to restart"), nil
internal/agent/tools/multiedit.go+1−1
@@ -66,7 +66,7 @@ func NewMultiEditTool(
6666) fantasy.AgentTool {
6767 return fantasy.NewAgentTool(
6868 MultiEditToolName,
69− string(multieditDescription),
69+ FirstLineDescription(multieditDescription),
7070 func(ctx context.Context, params MultiEditParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
7171 if params.FilePath == "" {
7272 return fantasy.NewTextErrorResponse("file_path is required"), nil
internal/agent/tools/read_mcp_resource.go+1−1
@@ -33,7 +33,7 @@ var readMCPResourceDescription []byte
3333func NewReadMCPResourceTool(cfg *config.ConfigStore, permissions permission.Service) fantasy.AgentTool {
3434 return fantasy.NewParallelAgentTool(
3535 ReadMCPResourceToolName,
36− string(readMCPResourceDescription),
36+ FirstLineDescription(readMCPResourceDescription),
3737 func(ctx context.Context, params ReadMCPResourceParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3838 params.MCPName = strings.TrimSpace(params.MCPName)
3939 params.URI = strings.TrimSpace(params.URI)
internal/agent/tools/references.go+1−1
@@ -36,7 +36,7 @@ var referencesDescription []byte
3636func NewReferencesTool(lspManager *lsp.Manager) fantasy.AgentTool {
3737 return fantasy.NewAgentTool(
3838 ReferencesToolName,
39− string(referencesDescription),
39+ FirstLineDescription(referencesDescription),
4040 func(ctx context.Context, params ReferencesParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
4141 if params.Symbol == "" {
4242 return fantasy.NewTextErrorResponse("symbol is required"), nil
internal/agent/tools/sourcegraph.go+1−1
@@ -45,7 +45,7 @@ func NewSourcegraphTool(client *http.Client) fantasy.AgentTool {
4545 }
4646 return fantasy.NewParallelAgentTool(
4747 SourcegraphToolName,
48− string(sourcegraphDescription),
48+ FirstLineDescription(sourcegraphDescription),
4949 func(ctx context.Context, params SourcegraphParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
5050 if params.Query == "" {
5151 return fantasy.NewTextErrorResponse("Query parameter is required"), nil
internal/agent/tools/todos.go+1−1
@@ -36,7 +36,7 @@ type TodosResponseMetadata struct {
3636func NewTodosTool(sessions session.Service) fantasy.AgentTool {
3737 return fantasy.NewAgentTool(
3838 TodosToolName,
39− string(todosDescription),
39+ FirstLineDescription(todosDescription),
4040 func(ctx context.Context, params TodosParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
4141 sessionID := GetSessionFromContext(ctx)
4242 if sessionID == "" {
internal/agent/tools/tools.go+15
@@ -2,6 +2,7 @@ package tools
22
33import (
44 "context"
5+ "strings"
56)
67
78type (
@@ -54,3 +55,17 @@ func GetSupportsImagesFromContext(ctx context.Context) bool {
5455func GetModelNameFromContext(ctx context.Context) string {
5556 return getContextValue(ctx, ModelNameContextKey, "")
5657}
58+
59+// FirstLineDescription returns the first non-empty line from the embedded
60+// markdown description. This extracts just the concise summary line,
61+// significantly reducing token usage while preserving essential tool context.
62+func FirstLineDescription(content []byte) string {
63+ lines := strings.Split(string(content), "\n")
64+ for _, line := range lines {
65+ line = strings.TrimSpace(line)
66+ if line != "" {
67+ return line
68+ }
69+ }
70+ return ""
71+}
internal/agent/tools/view.go+1−1
@@ -69,7 +69,7 @@ func NewViewTool(
6969) fantasy.AgentTool {
7070 return fantasy.NewAgentTool(
7171 ViewToolName,
72− string(viewDescription),
72+ FirstLineDescription(viewDescription),
7373 func(ctx context.Context, params ViewParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
7474 if params.FilePath == "" {
7575 return fantasy.NewTextErrorResponse("file_path is required"), nil
internal/agent/tools/web_fetch.go+1−1
@@ -31,7 +31,7 @@ func NewWebFetchTool(workingDir string, client *http.Client) fantasy.AgentTool {
3131
3232 return fantasy.NewParallelAgentTool(
3333 WebFetchToolName,
34− string(webFetchToolDescription),
34+ FirstLineDescription(webFetchToolDescription),
3535 func(ctx context.Context, params WebFetchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3636 if params.URL == "" {
3737 return fantasy.NewTextErrorResponse("url is required"), nil
internal/agent/tools/web_search.go+1−1
@@ -29,7 +29,7 @@ func NewWebSearchTool(client *http.Client) fantasy.AgentTool {
2929
3030 return fantasy.NewParallelAgentTool(
3131 WebSearchToolName,
32− string(webSearchToolDescription),
32+ FirstLineDescription(webSearchToolDescription),
3333 func(ctx context.Context, params WebSearchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
3434 if params.Query == "" {
3535 return fantasy.NewTextErrorResponse("query is required"), nil
internal/agent/tools/write.go+1−1
@@ -52,7 +52,7 @@ func NewWriteTool(
5252) fantasy.AgentTool {
5353 return fantasy.NewAgentTool(
5454 WriteToolName,
55− string(writeDescription),
55+ FirstLineDescription(writeDescription),
5656 func(ctx context.Context, params WriteParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
5757 if params.FilePath == "" {
5858 return fantasy.NewTextErrorResponse("file_path is required"), nil