95 lines
3.2 KiB
Org Mode
95 lines
3.2 KiB
Org Mode
#+TITLE: Web Research Skill (Generalized)
|
|
#+AUTHOR: org-agent
|
|
#+SKILL_NAME: skill-web-research
|
|
|
|
This skill provides the agent with internet connectivity via multiple pluggable browser engines.
|
|
|
|
* Trigger
|
|
#+begin_src lisp
|
|
(defun trigger-skill-web-research (context)
|
|
(let ((type (getf context :type))
|
|
(payload (getf context :payload)))
|
|
(and (eq type :EVENT)
|
|
(eq (getf payload :sensor) :delegation)
|
|
(eq (getf payload :target-skill) :web))))
|
|
#+end_src
|
|
|
|
* Browser Engines
|
|
We define multiple backends for fetching web content.
|
|
|
|
#+begin_src lisp
|
|
(defun fetch-with-lynx (url)
|
|
"Engine: Lynx. Best for fast text extraction from blogs/docs."
|
|
(let ((cmd (format nil "lynx -dump -nolist '~a'" url)))
|
|
(uiop:run-program cmd :output :string :ignore-error-status t)))
|
|
|
|
(defun fetch-with-curl (url)
|
|
"Engine: Curl. Best for raw HTML or API inspection."
|
|
(let ((cmd (format nil "curl -sL '~a'" url)))
|
|
(uiop:run-program cmd :output :string :ignore-error-status t)))
|
|
|
|
(defun fetch-with-playwright (url)
|
|
"Engine: Playwright (Placeholder). In the future, this calls a Python bridge."
|
|
(format nil "ERROR: Playwright engine not yet implemented. Falling back to Lynx...~%~a"
|
|
(fetch-with-lynx url)))
|
|
|
|
(defun web-fetch (url &optional engine)
|
|
"Dispatch the fetch request to the specified engine (defaults to Lynx)."
|
|
(case engine
|
|
(:lynx (fetch-with-lynx url))
|
|
(:curl (fetch-with-curl url))
|
|
(:playwright (fetch-with-playwright url))
|
|
(t (fetch-with-lynx url))))
|
|
#+end_src
|
|
|
|
* Neuro Prompt
|
|
System 1 chooses the engine based on the task complexity.
|
|
|
|
#+begin_src lisp
|
|
(defun neuro-skill-web-research (context)
|
|
(let* ((payload (getf context :payload))
|
|
(query (getf payload :query))
|
|
;; The LLM can specify an engine. If not, we default to Lynx.
|
|
(requested-engine (or (getf payload :engine) :lynx))
|
|
(is-url (or (search "http://" query) (search "https://" query)))
|
|
(target-url (if is-url
|
|
query
|
|
(format nil "https://duckduckgo.com/html/?q=~a" query)))
|
|
(web-text (web-fetch target-url requested-engine)))
|
|
|
|
(let ((curated (if (and web-text (> (length web-text) 5000))
|
|
(format nil "~a... [TRUNCATED]" (subseq web-text 0 5000))
|
|
(or web-text "No content fetched."))))
|
|
|
|
(format nil "
|
|
You are the Web Research synthesizer.
|
|
USER QUERY - '~a'
|
|
ENGINE USED - ~a
|
|
TARGET URL - ~a
|
|
|
|
RAW CONTENT FETCHED -
|
|
---
|
|
~a
|
|
---
|
|
|
|
Synthesize a concise, factual answer.
|
|
Return a Lisp plist - (:target :emacs :action :message :text \"your summary\")
|
|
" query requested-engine target-url curated))))
|
|
#+end_src
|
|
|
|
* Symbolic Verification
|
|
#+begin_src lisp
|
|
(defun verify-skill-web-research (proposed-action context)
|
|
(if (eq (getf proposed-action :action) :message)
|
|
proposed-action
|
|
'(:target :emacs :action :message :text "Web skill failed to synthesize message.")))
|
|
#+end_src
|
|
|
|
* Registration
|
|
#+begin_src lisp
|
|
(defskill :skill-web-research
|
|
:priority 80
|
|
:trigger #'trigger-skill-web-research
|
|
:neuro #'neuro-skill-web-research
|
|
:symbolic #'verify-skill-web-research)
|
|
#+end_src |