Skip to content

outskirtslabs/llx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

122 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ol.llx

Unified LLM API and agent runtime for Clojure, ClojureScript, and Clojure Dart.

doc status: experimental Clojars Project

ol.llx.ai

ol.llx.ai targets JVM Clojure, ClojureScript, and ClojureDart. Under the hood it is built around the API families that cover most of the current LLM ecosystem: OpenAI Completions, OpenAI Responses, Anthropic Messages, and Google Generative AI.

It absorbs provider quirks around streaming, tool calls, reasoning traces, and model behavior to present a unified API without relying on vendor SDKs or Java wrappers.

ol.llx.agent

ol.llx.agent sits on top of ol.llx.ai and handles the multi-turn agent loop.

Feature highlights:

  • tools run concurrently and can be aborted mid-execution

  • the steering queue can interrupt an active run, skip pending tools, and re-prompt

  • the follow-up queue can defer messages until the current turn finishes

  • event subscriptions expose structured turn, message, and tool lifecycle events

  • agent state can be snapshotted and rehydrated by the application

  • custom message roles allow app-specific history that is filtered before LLM submission

Project status: Experimental.

Installation

Only git dep usage will be supported for now while we are in the experimental phase.

;; deps.edn
{:deps {io.github.outskirtslabs/llx {:git/sha "39ecaa7d63d21cb9779f117c3bb0a7ca3c23890e"}}}

Quick Start

(require '[ol.llx.ai :as ai]
         '[ol.llx.agent :as agent]
         '[promesa.exec.csp :as sp])

(def read-tool
  {:name         "read_file"
   :description  "Read the contents of a file at the given path."
   :input-schema [:map [:path :string]]
   :execute      (fn [_id {:keys [path]} _abort _on-update]
                   {:content [{:type :text :text (slurp path)}]})})

(def a (agent/create-agent {:model         (ai/get-model :anthropic "claude-sonnet-4-6")
                            :system-prompt "You are a helpful assistant."
                            :tools         [read-tool]}))

;; subscribe to events
(let [ch (agent/subscribe a)]
  (future
    (loop []
      (when-let [ev (sp/take! ch)]
        (println (:type ev))
        (recur)))))

(agent/prompt a [{:role :user :content "read README.adoc" :timestamp 1}])

(agent/close a)

ol.llx.ai exposes unified entrypoints at ol.llx.ai/complete and ol.llx.ai/stream, with complete* and stream* available when you need provider-specific escape hatches.

License

Copyright © 2026 Casey Link

Distributed under the EUPL-1.2.

About

Unified LLM API and agent runtime for Clojure, ClojureScript (and soon Clojure Dart)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Contributors

Languages