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.
Client libraries and a shared runtime
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
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.
On a real machine
Each case is a task a person recognizes, what OA did, and what was measured on the owner's development machine.
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.
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 sits in the Jan app's model folder. LM Studio never downloaded it and cannot see it.
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
Choose a capability to see what it does and where it helps. Each example includes links to its API and current implementation.
Pick a capability, or step through them with Previous and Next.
Downloads, durable work, shared storage, permissions, questions to the user, credentials, logging, configuration, identity and finding the right service (resolution).
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.
1 of 21 · Foundations · Verified downloads
Contract:
Browse with the buttons above or the arrow keys when the carousel is focused.
Tools you can use
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.
Control panel
The local panel brings runtime health, accepted jobs, permission questions, rights, configuration, logs, and identity into one place. You can inspect a job, cancel work you own, answer a first-use question, and download a completed result.
Central command
The openabstractions command checks runtime status, probes capability access, manages durable jobs and downloads, configures credentials and providers, reviews rights, and lists or activates registered applications.
MCP gateway
Connect an MCP-compatible assistant to OA for application and model discovery, model responses, and background inference jobs.
Source-built development adapter. Its six tools include read-only application discovery. Application editing uses a separate application adapter.
Tool 1 of 3: Control panel
For developers
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)
}
}
import time
import abstraction.inference.api as api
from abstraction.facade.client import Machine
machine = Machine(deadline=time.monotonic() + 30)
chat = machine.resolve_inference()
reply = chat.complete(api.Request(
model="qwen3:8b",
messages=[api.Message(role=api.Role.USER, parts=[
api.Part(kind=api.PartKind.TEXT, text="Say hello in five words."),
])],
))
if reply.outcome != api.ReplyOutcome.COMPLETED:
raise SystemExit(f"chat {reply.outcome.value}: {reply.reason}")
print("".join(part.text for part in reply.message.parts))
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