@@ -3,8 +3,6 @@ package tools
33import (
44 "context"
55 "encoding/json"
6− "fmt"
7− "strings"
86)
97
108type ToolInfo struct {
@@ -27,10 +25,6 @@ const (
2725
2826 SessionIDContextKey sessionIDContextKey = "session_id"
2927 MessageIDContextKey messageIDContextKey = "message_id"
30−
31− maxResponseWidth = 3000
32− maxResponseHeight = 5000
33− maxResponseChars = 50000
3428)
3529
3630type ToolResponse struct {
@@ -43,75 +37,8 @@ type ToolResponse struct {
4337func NewTextResponse(content string) ToolResponse {
4438 return ToolResponse{
4539 Type: ToolResponseTypeText,
46− Content: truncateContent(content),
47− }
48−}
49−
50−func truncateContent(content string) string {
51− if len(content) <= maxResponseChars {
52− return truncateWidthAndHeight(content)
53− }
54−
55− truncated := content[:maxResponseChars]
56−
57− if lastNewline := strings.LastIndex(truncated, "\n"); lastNewline > maxResponseChars/2 {
58− truncated = truncated[:lastNewline]
59− }
60−
61− truncated += "\n\n... [Content truncated due to length] ..."
62−
63− return truncateWidthAndHeight(truncated)
64−}
65−
66−func truncateWidthAndHeight(content string) string {
67− lines := strings.Split(content, "\n")
68−
69− heightTruncated := false
70− if len(lines) > maxResponseHeight {
71− keepLines := maxResponseHeight - 3
72− firstHalf := keepLines / 2
73− secondHalf := keepLines - firstHalf
74−
75− truncatedLines := make([]string, 0, maxResponseHeight)
76− truncatedLines = append(truncatedLines, lines[:firstHalf]...)
77− truncatedLines = append(truncatedLines, "")
78− truncatedLines = append(truncatedLines, fmt.Sprintf("... [%d lines truncated] ...", len(lines)-keepLines))
79− truncatedLines = append(truncatedLines, "")
80− truncatedLines = append(truncatedLines, lines[len(lines)-secondHalf:]...)
81−
82− lines = truncatedLines
83− heightTruncated = true
84− }
85−
86− widthTruncated := false
87− for i, line := range lines {
88− if len(line) > maxResponseWidth {
89− if maxResponseWidth > 20 {
90− keepChars := maxResponseWidth - 10
91− firstHalf := keepChars / 2
92− secondHalf := keepChars - firstHalf
93− lines[i] = line[:firstHalf] + " ... " + line[len(line)-secondHalf:]
94− } else {
95− lines[i] = line[:maxResponseWidth]
96− }
97− widthTruncated = true
98− }
99− }
100−
101− result := strings.Join(lines, "\n")
102−
103− if heightTruncated || widthTruncated {
104− notices := make([]string, 0, 2)
105− if heightTruncated {
106− notices = append(notices, "height")
107− }
108− if widthTruncated {
109− notices = append(notices, "width")
110− }
111− result += fmt.Sprintf("\n\n[Note: Content truncated by %s to fit response limits]", strings.Join(notices, " and "))
40+ Content: content,
11241 }
113−
114− return result
11542}
11643
11744func WithResponseMetadata(response ToolResponse, metadata any) ToolResponse {