6.1 KiB
SKILL: Ollama Provider Agent (Universal Literate Note)
Overview
The Ollama Provider Agent enables the use of local, privacy-preserving LLM models. It integrates with a local Ollama instance to ensure system functionality and sovereignty without external internet connectivity.
Phase A: Demand (PRD)
1. Purpose
Define the interface for communication with a local Ollama daemon.
2. User Needs
- Sovereignty: Fallback backend independent of cloud providers.
- Performance: Efficient local network interaction.
- Simplicity: Deterministic, non-streaming text generation.
3. Success Criteria
TODO Local API Connectivity
TODO Model Specification (llama3)
TODO Response Extraction Verification
Phase B: Blueprint (PROTOCOL)
Phase B: Blueprint (PROTOCOL)
1. Architectural Intent
This protocol outlines the communication between the Ollama Provider Agent and the local Ollama instance. The primary goal is to provide a simple, deterministic interface for generating text from a specified language model. Error handling and model specification are crucial for robustness. We'll use a straightforward request-response pattern using the Ollama API. We will use the ollama HTTP API to avoid complex dependencies.
2. Semantic Interfaces
`ollama-generate`
This function sends a prompt to the local Ollama instance and returns the generated text.
:lisp (defun ollama-generate (model prompt &key (host "localhost:11434") (timeout 10)) "Generates text from the specified Ollama model.
MODEL: The name of the Ollama model. Example: \"llama3\" PROMPT: The text prompt to send to the model. HOST: The hostname and port of the Ollama instance. Defaults to localhost:11434 TIMEOUT: Timeout for the HTTP request in seconds. Defaults to 10
Returns: A string containing the generated text or NIL on error." (let ((url (format nil "http://~A/api/generate" host))) (let ((data (json:encode-json-to-string (alist-to-plist `((model . ,model) (prompt . ,prompt) (stream . false)))))) (handler-case (let ((response (drakma:http-request url :method :POST :content-type "application/json" :content data :timeout timeout :want-stream t))) (unwind-protect (let ((json-response (json:decode-json-from-stream (drakma:get-input-stream response)))) (getf json-response :response)) (drakma:close-http-connection response))) (drakma:http-request-error (e) (format t "Error in HTTP request: ~A~%" e) nil) (json:json-decode-error (e) (format t "Error decoding JSON response: ~A~%" e) nil) (error (e) (format t "Unexpected error: ~A~%" e) nil)))))
`ollama-model-exists-p`
This function checks if a given model exists in the local Ollama instance.
:lisp (defun ollama-model-exists-p (model &key (host "localhost:11434") (timeout 5)) "Checks if a model exists in the local Ollama instance.
MODEL: The name of the Ollama model to check. HOST: The hostname and port of the Ollama instance. Defaults to localhost:11434 TIMEOUT: Timeout for the HTTP request in seconds. Defaults to 5
Returns: T if the model exists, NIL otherwise." (let ((url (format nil "http://~A/api/tags" host))) (handler-case (let ((response (drakma:http-request url :method :GET :timeout timeout :want-stream t))) (unwind-protect (let ((json-response (json:decode-json-from-stream (drakma:get-input-stream response)))) (loop for model-data in (getf json-response :models) when (string= (getf model-data :name) model) do (return t) finally (return nil))) (drakma:close-http-connection response))) (drakma:http-request-error (e) (format t "Error in HTTP request: ~A~%" e) nil) (json:json-decode-error (e) (format t "Error decoding JSON response: ~A~%" e) nil) (error (e) (format t "Unexpected error: ~A~%" e) nil))))
`ollama-list-models`
Lists the available models in Ollama
:lisp (defun ollama-list-models (&key (host "localhost:11434") (timeout 5)) "Lists available models in the local Ollama instance.
HOST: The hostname and port of the Ollama instance. Defaults to localhost:11434 TIMEOUT: Timeout for the HTTP request in seconds. Defaults to 5
Returns: a list of model names (strings)." (let ((url (format nil "http://~A/api/tags" host))) (handler-case (let ((response (drakma:http-request url :method :GET :timeout timeout :want-stream t))) (unwind-protect (let ((json-response (json:decode-json-from-stream (drakma:get-input-stream response)))) (mapcar #'(lambda (m) (getf m :name)) (getf json-response :models))) (drakma:close-http-connection response))) (drakma:http-request-error (e) (format t "Error in HTTP request: ~A~%" e) nil) (json:json-decode-error (e) (format t "Error decoding JSON response: ~A~%" e) nil) (error (e) (format t "Unexpected error: ~A~%" e) nil))))