Client libraries and a shared runtime

One API for each kind of work, done by the program the person chooses.

OpenAbstractions is a background service plus client libraries. It gives applications one API each for downloads, background jobs, model calls, shared files, secrets and questions to the person. The person who runs the computer chooses which program does the work, such as curl, Ollama, LM Studio, a NAS or OpenRouter.

For developers: add one client library to your application and declare the OpenAbstractions runtime as a dependency your installer brings along, the way installers bring the Visual C++ Redistributable. Your code keeps its own shape; the runtime supplies the capability. This is SLF4J’s idea applied to machine services.

Today you install the runtime once yourself and the applications below connect to it. An application that adopts OA can bring it along in its own installer.

The latest runtime release notes list available packages, checksums, signing state and package verification.

How it fits your application

Add one capability at a time

Use the capabilities your application needs. The OA runtime runs on the user’s machine and connects them to compatible implementations, including services on other machines. Users manage permissions and provider choices in one place.

  1. 1 Application uses a capability, such as downloading a file
  2. 2 OA library connects the application to the local OA runtime
  3. 3 OA service checks permission and manages the work
  4. 4 Provider does the work: curl, Ollama, LM Studio, a NAS or OpenRouter

On a real machine

What a shared service changes

Each case is a task a person recognizes, what OA did, and what was measured on the owner's development machine.

An image editor keeps rendering while a chat engine gives the card back

The task

ComfyUI needs more of the graphics card than is free. LM Studio is holding a model on the same card, and neither program knows the other exists.

OA's role

ComfyUI asks the resource service for room on the card. The service asks LM Studio to give its memory back through LM Studio's own unload endpoint, then grants ComfyUI a lease once the memory is free.

LM Studio gave back 21.4 GB of graphics memory in 7.3 s, and the render finished in about 31 s. A deny rule for the same holder turned the identical request into a refusal in about 150 ms, with LM Studio's model still loaded. Measurements and source.

A model file downloaded once is served by another engine

The task

A model file sits in the Jan app's model folder. LM Studio never downloaded it and cannot see it.

OA's role

The model bridge finds the file in the storage inventory and links it into LM Studio's models folder, once the person permits lending to that engine.

A 46 MB file appeared in LM Studio's list 6.3 seconds after the request, and the source file never moved. Measurements and source.

Explore Open Abstractions

Discover the capabilities

Choose a capability to see what it does and where it helps. Each example includes links to its API and current implementation.

Foundations

Downloads, durable work, shared storage, permissions, questions to the user, credentials, logging, configuration, identity and finding the right service (resolution).

AI on this machine

Model catalogue, routing, inference, a local model server, sharing the graphics card, lending model files, the stores already on this machine, and the MCP gateway.

Tools you can use

Tools for people, scripts and AI assistants

Manage background work, choose permissions, inspect activity or connect your assistant to OA. These examples show the current source; release notes identify the tools and commands included in each package.

For developers

Start with a familiar language

This example asks a model a question through OA. The person chooses which model server answers, and the service keeps any API key out of your application.

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    facade "github.com/openabstractions/abstraction-facade/go"
    wire "github.com/openabstractions/abstraction-inference/go/abstraction/inference/api"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    chat, err := facade.Discover().ResolveInference(ctx, facade.Requirements{})
    if err != nil {
        log.Fatal(err)
    }
    reply, err := chat.Complete(ctx, wire.Request{
        Model: "qwen3:8b",
        Messages: []wire.Message{{Role: wire.RoleUser, Parts: []wire.Part{
            {Kind: wire.PartKindText, Text: "Say hello in five words."},
        }}},
    })
    if err != nil {
        log.Fatal(err)
    }
    if reply.Outcome != wire.ReplyOutcomeCompleted {
        log.Fatalf("chat %s: %s", reply.Outcome, reply.Reason)
    }
    for _, part := range reply.Message.Parts {
        fmt.Print(part.Text)
    }
}

All five languages can use OA’s shared native IPC. Go, Python and C++ include it in their default client entry points. Rust and JavaScript use separate native connector packages. See the language setup guides for C++, Rust and JavaScript, dependencies and runtime identity checks.

Next steps

Get started with Open Abstractions