(in-package :org-agent) (defvar *provider-pain-table* (make-hash-table :test 'equal)) (defun token-accountant-record-pain (provider) "Marks a provider as 'pained' (failed). It will be de-prioritized." (setf (gethash provider *provider-pain-table*) (+ (get-universal-time) 600)) ; 10 min penalty (kernel-log "ACCOUNTANT - Provider ~a de-prioritized due to failure." provider)) (defun token-accountant-get-cascade (context) "Returns a dynamic list of providers, routing around pained ones." (let ((all-providers '(:openrouter :groq :gemini)) (healthy nil) (pained nil) (now (get-universal-time))) (dolist (p all-providers) (if (> (or (gethash p *provider-pain-table*) 0) now) (push p pained) (push p healthy))) (append (nreverse healthy) (nreverse pained)))) (defun token-accountant-get-model-for-provider (provider &optional context) "Returns the recommended model for the provider." (case provider (:openrouter "moonshotai/kimi-k2.5") (:groq "llama-3.3-70b-versatile") (:gemini "gemini-1.5-flash-latest") (t nil))) (defun token-accountant-patch-kernel () "Hot-patches the kernel's cascade to use our dynamic logic." (setf *provider-cascade* #'token-accountant-get-cascade))