Avoid forcing local large draft repairs
ober
135ae767fcf77af774d32937a2b9d16f38dfdbda
--- a/src/jcode/core/verified-run.ss +++ b/src/jcode/core/verified-run.ss @@ -20,6 +20,7 @@ default-verify-command default-verified-max-iterations current-required-range-repair + large-unclosed-rejected-draft-content? long-prefix-exact-replacement-block-message) (import :std/os/aproc @@ -450,9 +451,26 @@ (tool-specs-include? specs "edit") (openai-function-tool-choice "edit"))) +(def (large-unclosed-rejected-draft-content? msg content) + (and (string? msg) + (string? content) + (> (string-length content) 4096) + (if (or (string-contains msg + "delimiter balance failed: Unclosed") + (string-contains msg + "Minimal EOF delimiter repair was not applied")) + #t + #f))) + +(def (large-unclosed-rejected-draft?) + (let ((draft (current-rejected-ss-draft))) + (and (pair? draft) + (large-unclosed-rejected-draft-content? + (current-rejected-draft-guard-message) + (cdr draft))))) + (def (rejected-draft-direct-edit-guard?) - (let ((msg (current-rejected-draft-guard-message)) - (draft (current-rejected-ss-draft))) + (let ((msg (current-rejected-draft-guard-message))) (and (string? msg) (or (string-contains msg "list-set! is not available") (string-contains msg "random-make-state") @@ -460,12 +478,13 @@ (string-contains msg "Jerboa has no break form") (string-contains msg "Jerboa has no continue form") (string-contains msg "Jerboa imports use") - (and (pair? draft) - (> (string-length (cdr draft)) 4096) - (or (string-contains msg - "delimiter balance failed: Unclosed") - (string-contains msg - "Minimal EOF delimiter repair was not applied"))))))) + (large-unclosed-rejected-draft?))))) + +(def (suppress-local-staged-tool-choice? staged-tool) + (and (current-verified-local-model?) + (string? staged-tool) + (string=? staged-tool "edit") + (large-unclosed-rejected-draft?))) (def (force-staged-create-repair-tool-name specs) ;; Syntax-broken missing-file creates have no on-disk artifact yet. The @@ -582,18 +601,24 @@ (else (current-max-tokens-cap))))) (if (procedure? provider) - (let* ((specs (verified-provider-tool-specs tool-specs)) - (staged-tool - (force-staged-create-repair-tool-name specs)) - (staged-choice - (and staged-tool - (openai-function-tool-choice staged-tool))) - (forced-choice - (or staged-choice - (force-first-edit-tool-choice specs))) - (forced-specs - (if staged-tool - (forced-staged-repair-specs specs staged-tool) + (let* ((specs (verified-provider-tool-specs tool-specs)) + (staged-tool + (force-staged-create-repair-tool-name specs)) + (suppress-staged-choice? + (suppress-local-staged-tool-choice? staged-tool)) + (staged-choice + (and staged-tool + (not suppress-staged-choice?) + (openai-function-tool-choice staged-tool))) + (first-edit-choice + (and (not suppress-staged-choice?) + (force-first-edit-tool-choice specs))) + (forced-choice + (or staged-choice + first-edit-choice)) + (forced-specs + (if staged-tool + (forced-staged-repair-specs specs staged-tool) (forced-first-edit-specs specs forced-choice)))) (if staged-tool (forced-staged-repair-response @@ -628,12 +653,18 @@ ((make-provider-backend (get-expert-provider) chat-direct-via-stream) messages specs #f)) - (let* ((first-edit-choice (force-first-edit-tool-choice specs)) - (staged-tool - (force-staged-create-repair-tool-name specs)) - (staged-choice - (and staged-tool - (openai-function-tool-choice staged-tool))) + (let* ((raw-first-edit-choice (force-first-edit-tool-choice specs)) + (staged-tool + (force-staged-create-repair-tool-name specs)) + (suppress-staged-choice? + (suppress-local-staged-tool-choice? staged-tool)) + (first-edit-choice + (and (not suppress-staged-choice?) + raw-first-edit-choice)) + (staged-choice + (and staged-tool + (not suppress-staged-choice?) + (openai-function-tool-choice staged-tool))) (forced-choice (or staged-choice first-edit-choice)) (forced-specs (if staged-tool --- a/test/run.ss +++ b/test/run.ss @@ -9285,6 +9285,23 @@ (not (member "balance" names))))) (safe-delete-test-file! target-path)) + (let ([large-draft (make-string 5000 #\space)]) + (check! "verified-run: large unclosed draft suppresses provider force" + (large-unclosed-rejected-draft-content? + "delimiter balance failed: Unclosed ( opened at line 10" + large-draft) + #t) + (check! "verified-run: small unclosed draft keeps structural force path" + (large-unclosed-rejected-draft-content? + "delimiter balance failed: Unclosed ( opened at line 10" + "(def (main)\n") + #f) + (check! "verified-run: large unrelated draft keeps normal force path" + (large-unclosed-rejected-draft-content? + "list-set! is not available" + large-draft) + #f)) + (let* ([vr-dir "/tmp"] [target "jcode-verified-hidden-write-after-syntax-create.ss"] [target-path (string-append vr-dir "/" target)]