branch: externals/llm
commit 8b95d3c914022f0cac2116e0aea7d6edb746ea56
Author: Andrew Hyatt <[email protected]>
Commit: GitHub <[email protected]>
Substitute json false values in results without recursion (#244)
---
llm-provider-utils.el | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/llm-provider-utils.el b/llm-provider-utils.el
index c28ee0b8ef..3836090c14 100644
--- a/llm-provider-utils.el
+++ b/llm-provider-utils.el
@@ -828,15 +828,30 @@ This transforms the plist so that:
"Normalize ARGS to a form that can be passed to the user.
This will convert all :json-false and :false values to FALSE-VAL."
- (cond
- ((vectorp args) (vconcat (mapcar (lambda (a)
- (llm-provider-utils--normalize-args a
false-val))
- args)))
- ((consp args) (cons
- (llm-provider-utils--normalize-args (car args) false-val)
- (llm-provider-utils--normalize-args (cdr args) false-val)))
- ((member args '(:json-false :false)) false-val)
- (t args)))
+ (if (member args '(:json-false :false))
+ false-val
+ (let ((stack (list args))
+ (current nil))
+ (while stack
+ (setq current (pop stack))
+ (cond
+ ((consp current)
+ (if (member (car current) '(:json-false :false))
+ (setcar current false-val)
+ (when (or (consp (car current)) (vectorp (car current)))
+ (push (car current) stack)))
+ (if (member (cdr current) '(:json-false :false))
+ (setcdr current false-val)
+ (when (or (consp (cdr current)) (vectorp (cdr current)))
+ (push (cdr current) stack))))
+ ((vectorp current)
+ (dotimes (i (length current))
+ (let ((val (aref current i)))
+ (if (member val '(:json-false :false))
+ (aset current i false-val)
+ (when (or (consp val) (vectorp val))
+ (push val stack))))))))
+ args)))
(defun llm-provider-utils-execute-tool-uses (provider prompt tool-uses
multi-output
partial-result
success-callback