34 lines
2.1 KiB
Common Lisp
34 lines
2.1 KiB
Common Lisp
(in-package :org-agent)
|
|
|
|
(defun think (context)
|
|
(let ((active-skill (find-triggered-skill context)))
|
|
(if active-skill
|
|
(progn
|
|
(kernel-log "SYSTEM 1: Engaging skill '~a'~%" (skill-name active-skill))
|
|
(let* ((prompt-generator (skill-neuro-prompt active-skill))
|
|
(prompt (when prompt-generator (funcall prompt-generator context))))
|
|
(if prompt
|
|
(let* ((thought (ask-neuro prompt :context context))
|
|
;; Improved cleaning: Extract content between ``` blocks if they exist
|
|
(cleaned-thought
|
|
(let ((match (cl-ppcre:scan-to-strings "(?s)```(?:lisp)?\\n?(.*?)\\n?```" thought)))
|
|
(if match
|
|
(let ((regs (nth-value 1 (cl-ppcre:scan-to-strings "(?s)```(?:lisp)?\\n?(.*?)\\n?```" thought))))
|
|
(if (and regs (> (length regs) 0)) (elt regs 0) thought))
|
|
(string-trim '(#\Space #\Newline #\Tab) thought))))
|
|
(suggestion (ignore-errors (read-from-string cleaned-thought))))
|
|
(kernel-log "SYSTEM 1 Suggestion: ~a~%" cleaned-thought)
|
|
(cond
|
|
((and suggestion (listp suggestion)) suggestion)
|
|
;; SALVAGE: If LLM returned plain text or a non-list symbol
|
|
((and (let ((p (getf context :payload))) (eq (getf p :sensor) :chat-message))
|
|
(> (length cleaned-thought) 0))
|
|
(kernel-log "SYSTEM 1: SALVAGING plain-text response.~%")
|
|
(let* ((no-prefix (cl-ppcre:regex-replace "(?i)^(okay,? |sure,? |i will |i've |i have |here is |got it\\.? |understood\\.? |done\\.? |yes,? )+" cleaned-thought "")))
|
|
`(:target :emacs :payload (:action :insert-at-end :buffer "*org-agent-chat*" :text ,no-prefix))))
|
|
(t
|
|
(kernel-log "SYSTEM 1 ERROR: Could not parse response as Lisp plist.~%")
|
|
nil)))
|
|
nil)))
|
|
nil)))
|