Truncate tool results to 16KB to prevent context overflow
ober
81781baca0aaa22bb9c29e18cadab8fad3084168
--- a/lib/jcode/tool/registry.sls +++ b/lib/jcode/tool/registry.sls @@ -35,17 +35,32 @@ (register-tool! name description schema handler) (let ([t (hash-get *tools* name)]) (when t (hash-put! t "internal" #t)))) + (def *max-tool-result-len* 16000) + (def (truncate-result str) + (if (<= (string-length str) *max-tool-result-len*) + str + (let ([keep (quotient *max-tool-result-len* 2)]) + (string-append + (substring str 0 keep) + (format + "\n\n... [truncated ~a chars] ...\n\n" + (- (string-length str) *max-tool-result-len*)) + (substring + str + (- (string-length str) keep) + (string-length str)))))) (def (tool-execute name args) (log-info logger "execute" `((name . ,name))) (let ([tool (hash-get *tools* name)]) (if tool - (try ((hash-ref tool "handler") args) - (catch - (e) - (format - "Error executing ~a: ~a" - name - (err->string e)))) + (let ([result (try ((hash-ref tool "handler") args) + (catch + (e) + (format + "Error executing ~a: ~a" + name + (err->string e))))]) + (truncate-result result)) (format "Unknown tool: ~a" name)))) (def (get-tool-schemas) (map tool->openai-schema --- a/src/jcode/tool/registry.ss +++ b/src/jcode/tool/registry.ss @@ -33,14 +33,27 @@ (let ((t (hash-get *tools* name))) (when t (hash-put! t "internal" #t)))) +(def *max-tool-result-len* 16000) + +(def (truncate-result str) + (if (<= (string-length str) *max-tool-result-len*) + str + (let ((keep (quotient *max-tool-result-len* 2))) + (string-append + (substring str 0 keep) + (format "\n\n... [truncated ~a chars] ...\n\n" + (- (string-length str) *max-tool-result-len*)) + (substring str (- (string-length str) keep) (string-length str)))))) + (def (tool-execute name args) (log-info logger "execute" `((name . ,name))) (let ((tool (hash-get *tools* name))) (if tool - (try - ((hash-ref tool "handler") args) - (catch (e) - (format "Error executing ~a: ~a" name (err->string e)))) + (let ((result (try + ((hash-ref tool "handler") args) + (catch (e) + (format "Error executing ~a: ~a" name (err->string e)))))) + (truncate-result result)) (format "Unknown tool: ~a" name)))) (def (get-tool-schemas)