on main help sign in
fix(tools): do not truncate output (#657)
e00a70aCarlos Alexandro Becker
internal/llm/tools/tools.go+1−74
@@ -3,8 +3,6 @@ package tools
3import (
3import (
4 "context"
4 "context"
5 "encoding/json"
5 "encoding/json"
6− "fmt"
7− "strings"
8)
6)
9
7
10type ToolInfo struct {
8type ToolInfo struct {
@@ -27,10 +25,6 @@ const (
27
25
28 SessionIDContextKey sessionIDContextKey = "session_id"
26 SessionIDContextKey sessionIDContextKey = "session_id"
29 MessageIDContextKey messageIDContextKey = "message_id"
27 MessageIDContextKey messageIDContextKey = "message_id"
30−
31− maxResponseWidth = 3000
32− maxResponseHeight = 5000
33− maxResponseChars = 50000
34)
28)
35
29
36type ToolResponse struct {
30type ToolResponse struct {
@@ -43,75 +37,8 @@ type ToolResponse struct {
43func NewTextResponse(content string) ToolResponse {
37func NewTextResponse(content string) ToolResponse {
44 return ToolResponse{
38 return ToolResponse{
45 Type: ToolResponseTypeText,
39 Type: ToolResponseTypeText,
46− Content: truncateContent(content),
40+ Content: 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 "))
112 }
41 }
113−
114− return result
115}
42}
116
43
117func WithResponseMetadata(response ToolResponse, metadata any) ToolResponse {
44func WithResponseMetadata(response ToolResponse, metadata any) ToolResponse {