Prepare identity first
Create the idempotency key before sending work. Equal duplicate submissions recover the original receipt.
GetHistoryWindow · Submit · ReconcileDeveloper reference
This page is for developers integrating a capability; people who use applications find the install steps on the Adopt page.
Open Abstractions gives applications stable capability APIs above operating systems, local engines, and remote services. This page defines the shared vocabulary, shows the service lifecycle, and indexes the current APIs.
The latest runtime release notes identify the available packages and their verification. The retained 0.3.0 evidence describes that release. Capability SDKs have independent versions. Match package availability and installation evidence to the API you adopt.
Shared vocabulary
card:0 names the first one.openabstractions-flat/abstraction-*, stacked so a higher module builds on a lower one's guarantees, such as the model module resolving a reference before the download module moves bytes.abstraction.logging/sink@1, and the endpoint inside the runtime that answers its calls — one word for the interface and the thing that answers it, as gRPC uses it. Distinct from a contract, the numbered rule set that defines its promises and limits. In the module catalogue, service is the Kind a module's definition earns by declaring a service that is not direct.inventoryd, which indexes what a machine already holds, or lemonaded, which serves images, transcription and speech. In the module catalogue, provider is also a Kind value: a module named <x>-over-<y> with a command, or one whose definition declares guarantees and no service.openabstractions serve runtime: installed, the platform's service manager starts it as the background service; run directly, the same command starts it in the foreground. On Windows the per-user supervisor, openabstractions serve supervisor, starts it and restarts it after a failure.Machine selects and trusts the local runtime; Resolve… methods return a bound client.CONTRACT.md: the document stating a contract's obligations, admission order and refusal reasons. Its rule ids, such as INF-A1, are what tests and refusals cite.local, remote, or any where the capability supports it; the resolved endpoint has a fixed placement.Bind/BindConn) takes once at accept and freezes, refusing a later re-derivation.abstraction-job. Other capabilities submit through it rather than each tracking accepted work of their own. An accepted job is work a service owns; its receipt records the job identifier, logical owner, idempotency key, binding, and accepted guarantees.budget_exceeded.content-writer@1.abstraction-cas maintains.HANDLE.abstraction.logging/sink@1. Default handlers resolve an OA logging service and report resolution failures. After a service outage, they retry with a bounded queue and report dropped records. Local fallback requires explicit provider selection.download.Open()/Get()) and by the runtime for a job-service download, to its own result document. It never names the store.abstraction.resource/leases@1) is asked back with a deadline, renewed while the holder keeps using it, and given back when the holder yields. A job's lease is exclusive, carries an epoch, and is never asked back; job states it with the job (JOB-L1).Answer; an attached holder yields through its server's own unload. What the instrument shows afterwards is the answer. An engine's own eviction is not a yield.inference server add (inference host add until the next release) and addressed by a rights rule as host:<name> (renamed to server:<name> on the wire in a later release). abstraction-provider-modelhost's own process, which loads a model file into an engine and keeps it resident, is declared to the runtime the same way, as host:modelhost.OLLAMA_HOST or a --host flag. Distinct from a model server.credential:<name> or account as a rights target; card:<n> for an accelerator's memory (cuda:0 on CUDA, a DirectML adapter, or DRM card0), memory for system memory, or awake, the pool a wake lease claims, as one of the machine's scarce pools.abstraction.credentials/manager@1 service that registers, rotates, revokes, lists, and audits named secrets.*Operator services (abstraction.rights/operator@1, abstraction.asks/operator@1, and others) that such a person, or a program the installation trusts as one, reaches through an explicitly authorized typed-peer callback.config.go, Python python/abstraction_config.py) is kept for a deliberate out-of-tree adopter that reads configuration files directly instead of the service; Load, Watch, and JobStore are its deprecated names. Job's file-backed record interface (Store, shipped as NewFileStore) is deprecated the same way.family_source: alias); an alias reaches a store's own name for the same content by one matching function.why reason, when its credential could not be applied or its wire kind is unsupported.Pick's hosted outcome names one answering instead of a local server; its entry names a base URL, a wire kind, and a credential name.llama-server, sd-server or Lemonade. A provider module wraps an engine the machine has, or OA supplies one as its own registered provider process. The model host and the Lemonade provider run publishers' pinned builds staged from archives a person or Setup downloads, and the model host's PyTorch engine, which OA wrote, is moving into its own provider module.abstraction.storage/lend@1. Never a move, a rename, or a deletion.abstraction.storage/inventory@1 from designated abstraction.storage/inventory-source@1 providers, such as local-stores' own indexer.data, cache, tmp, or logs.cache object marked for the platform cleaner.application@1 uses a fixed catalogue; ordinary application@2 carries app-authored choices with explicit replay bounds. Ordinary answers select app behavior; first-use permission answers have exact Rights effects.abstraction.asks/responder@1, under an exact rule that expires. It never answers a question about itself.profile:image, until its next service version.output:image for generated pictures or input:audio for audio to transcribe. One first-use allow writes both rights on it.abstraction-inference/go/providerhost that provider programs build on: engine-file proofs, clean launch environments, loopback checks, and request checks for engines such as sd-server.awake. Today the lease takes a platform request only while its holder also holds a card lease, and that request keeps the display on as well. In 0.4.0 a provider that declares a card holds it for the work it serves, a provisional exception that a lease held for the requesting application replaces after research.awake:display, the wake level that keeps the display on and holds off the screen saver and automatic lock. Decided as its own rule per application and not built yet.chat@2 or image@2 request names one in place of a model, and the runtime picks an available candidate from it.Service lifecycle
Resolver.Resolve.Go resolution shape
machine := facade.Discover()
logs, err := machine.ResolveLog(ctx, facade.Requirements{
Scope: facade.ScopeLocal,
})
if err != nil { /* inspect the typed binding error */ }
logs.Write(record)
Left unset, Requirements.Scope resolves as any; set local or remote explicitly to restrict placement.
A later resolution may choose another eligible provider. An existing binding stays specific to the selected service. The facade contract defines resolution, trust, and binding behavior.
Durable work
Create the idempotency key before sending work. Equal duplicate submissions recover the original receipt.
GetHistoryWindow · Submit · ReconcileCanceling a transport wait ends that wait. Explicit work cancellation uses CancelWork with the original idempotency key.
ObserveWork · CancelWorkReconnect to the original logical owner and call Reconcile. A new idempotency key would describe new work.
AcceptanceResult · ReceiptOpaque cursors belong to one provider instance and caller subject. A gap asks the caller to restart from a current snapshot or recover through a contract-specific path.
cursor · epoch · gapThe job contract defines accepted-work ownership, reconciliation, explicit cancellation, retained results, and inventory bounds.
Applications and assistants
These methods belong to abstraction.facade/applications@2. An interface entry describes an application-owned protocol such as comfy.presentation@1. Metadata does not invoke that protocol.
An application interaction adapter implements the protocol and preserves the selected instance, context, and revision through preview, apply, and readback. A stale revision refuses an outdated target. This adapter is specific to the application interface.
An MCP gateway maps a curated tool set onto OA clients and application adapters. The MCP gateway runs as its own verified integration subject and receives explicit rights. It exposes a selected tool set rather than generic forwarding to arbitrary MCP servers or application methods.
Failure and recovery
| Result | Meaning | Caller response |
|---|---|---|
forbidden | The resolution boundary's own peer check: a different account, or a caller that cannot be verified. | Run the program as the runtime's own account. No capability-specific rule is read yet. |
not_permitted | A verified caller's own rights rule refuses the action or resource, decided inside the call. | Change the grant or choose an allowed action; see inference's Set up a model server for a worked grant. |
not_ready / unavailable | The required service or provider cannot serve the call now. | Observe readiness or retry within the contract's bounds. |
unmet_requirements | No eligible candidate supplies every requested guarantee or placement. | Install or configure a suitable provider, or revise the requirement explicitly. |
unsupported | The selected contract lacks the requested optional behavior. | Use a supported method or resolve a contract that declares it. |
invalid | Input violates the contract's shape, bound, state, or identifier rules. | Correct the request. Repeating the same bytes gives the same refusal. |
stale / conflict | A revision or compare-and-set base no longer names the current state. | Read the current state and decide again. |
gap | Retained history cannot prove continuous delivery from the supplied cursor. | Restart from a current snapshot or use the contract's recovery method. |
uncertain / unknown | The caller lacks evidence of the effect or accepted work. | Reconcile with the same idempotency key or read current state before acting. |
Each contract owns its exact enum and recovery rule. The table is a navigation aid across recurring meanings.
API index
Method names below come from the current Thrift definitions and generated Go facade. Direct utilities are marked separately.
Retain bounded requests and answers. Applications own ordinary choice UI; OA owns permission presentation.
abstraction.asks/application@1 abstraction.asks/application@2 abstraction.asks/operator@1
Facade: ResolveAsks, ResolveAsksChoices, ResolveAsksOperator
Legacy catalogue: Ask, Observe; ListQuestions, AnswerQuestion, RetireQuestion
Ordinary choice: Ask, Observe, Answer, Dismiss, Acknowledge; explicitly authorized operators use account-wide AnswerChoice/DismissChoice.
Caller-scoped Answer/Dismiss is integrated at ed97c10f8; the Go terminal example is integrated at f27944846. Ordinary agent delegation remains planned. Acknowledgement confirms an already-recorded answer. Asking requires explicit abstraction.asks/question.ask on account.
Presentation ownership and current limits. Legacy catalogue example:
q, err := facade.Discover().ResolveAsks(ctx, facade.Requirements{})
obs, err := q.AskContext(ctx, asks.ApplicationQuestion{
RequestKey: "dl-example.com", Key: "download.reach",
Slots: map[string]string{"host": "example.com"}})
fmt.Println(obs.Outcome) // "pending" until a person answersReplace a file from an expected base, or change it while holding the shared cross-process lock.
direct utility
Go: Read, Write, Change, NewPlacement
Python/C++: read, write, change, Placement
Read effective provider settings with provenance, edit the user location, and observe the current revision.
abstraction.config/reader@1 abstraction.config/editor@1 abstraction.config/observer@1
Facade: ResolveConfig, ResolveConfigEditor, ResolveConfigObserver
Methods: Read; ReadUser, ReplaceUser; Observe
cfg, err := facade.Discover().ResolveConfig(ctx, facade.Requirements{})
snapshot, err := cfg.ReadContext(ctx)
fmt.Println(snapshot.Store, snapshot.Origins.Store.Rung)Store named credentials, constrain their allowed target and consumer, and apply them inside an authorized service.
abstraction.credentials/holder@1 abstraction.credentials/applier@1
Facade: ResolveCredentials, ResolveCredentialsApplier
Methods: Store, Rotate, Revoke, List, Audit; Check, Apply
holder, err := facade.Discover().ResolveCredentials(ctx, facade.Requirements{})
page, err := holder.List(ctx, "", 32)
fmt.Println(page.Records)Describe a download as durable work with sources, destination, digest, network cost, and credential requirements.
request vocabulary + abstraction.job/acceptance@1
Service path: encode the generated download request, then use ResolveJobs and Submit.
Direct provider bridge: Open, Get, Submit, ResumeOrGet.
Resolve capabilities, bind typed clients, describe endpoints, and manage provider registrations.
abstraction.facade/resolver@1 abstraction.facade/caller@1 abstraction.facade/endpoint@1 abstraction.facade/registry@1
Entry point: New / Machine
Wire methods: Resolve; Observe; Describe; Declarations, Declare, Withdraw, Observe
Bind operating-system evidence about the peer to the accepted native connection.
direct transport utility
Go: OfHandle, CanEver, proof-checked peer attributes, and identity-bound listeners. Capability services consume the verified peer at their receiving boundary.
Bind model chat, embeddings, transcription, speech, live audio, image generation, and operator controls to mediated providers. Video generation runs as durable inference work through Jobs.
abstraction.inference/chat@1 abstraction.inference/embed@1 abstraction.inference/transcription@1 abstraction.inference/speech@1 abstraction.inference/live@1 abstraction.inference/image@1 abstraction.inference/operator@1
Facade: ResolveInference, ResolveEmbeddings, ResolveInferenceOperator. Generated clients bind the other modality endpoints.
Complete is Stream's non-streaming twin, observing a call to its end and folding the deltas into one reply. Complete names the Go method below; abstraction.inference/complete names the rights action the runtime checks inside it.
chat, err := facade.Discover().ResolveInference(ctx, facade.Requirements{})
// forbidden here is the resolution boundary's own peer check, not a missing grant
reply, err := chat.Complete(ctx, wire.Request{Model: "llama3.1", Messages: msgs})
fmt.Println(reply.Outcome) // not_permitted is a missing per-server grant, CONTRACT.md INF-A2The same service through the inference gateway, for a program that only speaks the OpenAI or Anthropic API:
openabstractions inference gateway on --address 127.0.0.1:8765
openabstractions inference key issue --for /absolute/path/to/curl
curl http://127.0.0.1:8765/v1/chat/completions -H "Authorization: Bearer oalk_..." \
-d '{"model":"llama3.1","messages":[{"role":"user","content":"Say hello in five words."}]}'Generated API schema · Modality methods · Set up a model server · Full Go example
Accept durable work, reconcile a lost submission reply, observe it, cancel it explicitly, read results, and list caller or account work.
abstraction.job/acceptance@1 abstraction.job/operations@1 abstraction.job/inventory@1 abstraction.job/operator@1
Facade: ResolveJobs, ResolveJobOperations, ResolveJobInventory, ResolveJobOperator
Core: Submit, Reconcile, CancelWork, ObserveWork, ReadResult, ListWork
Submit structured records, read retained pages, and long-poll for later records.
abstraction.logging/sink@1 abstraction.logging/reader@1 abstraction.logging/observer@1
Facade: ResolveLog, ResolveLogReader, ResolveLogObserver
Methods: Write, Read, Observe
logs, err := facade.Discover().ResolveLog(ctx, facade.Requirements{})
err = logs.LogContext(ctx, 0, "worker started", map[string]string{"component": "indexer"})Resolve a portable model reference to a manifest and the credentials or content needed to obtain it.
abstraction.model/resolver@1 abstraction.model/manifest@1
Facade: ResolveModel
Methods: ModelResolver.Resolve, ModelManifest.Resolve; ergonomic clients expose ResolveContext.
Decide whether a verified peer may perform an action on a resource, and administer explicit policy rules.
abstraction.rights/authorization@1 abstraction.rights/operator@1
Facade: ResolveRights, ResolveRightsOperator
Methods: Decide, DecideFor; ListPolicy, SetRule, RevokeRule, ReadRule, RegisterAction
List eligible models and servers, then pick a model server under execution and model requirements.
abstraction.router/router@1
Facade: ResolveRouter
Methods: Models, Hosts, Pick
Read immutable content by digest, write through bounded sessions, and observe or list changes under resource policy.
abstraction.storage/content-reader@1 abstraction.storage/content-writer@1 abstraction.storage/content-changes@1
Facade: ResolveStorage, ResolveStorageWriter, ResolveStorageChanges
Methods: Open, Read, Close; Begin, Append, Commit, Abort; Observe, List
Turn polled or pushed state into current snapshots and quiet notifications, or settle a burst after a quiet budget.
direct utility
Go: Poll, Push, Post, Current, Next, Close, Settle. Watch reports current state and quiet periods; it carries no retained history.
Manage operator-installed application manifests, observe ready instances and contexts, and activate a registered application.
abstraction.facade/applications@2
Facade: ResolveApplications
Methods: Register, Remove, Announce, Withdraw, Observe, Activate
Generated schemas
Each page below comes from that contract's Thrift definition through the shared docs generator, one page per contract. The rule tags cite the contract's CONTRACT.md.
abstraction.model/resolver@1 abstraction.model/manifest@1
The resolver maps a portable reference to a download; the manifest names a descriptor's parts under the component rule MODEL-C1–MODEL-C3.
abstraction.router/router@1
The router reports inventory, residency and pick decisions; its Component struct folds a projector or VAE into a family under the model contract's MODEL-C3.
abstraction.inference/chat@1 abstraction.inference/embed@1 abstraction.inference/transcription@1 abstraction.inference/speech@1 abstraction.inference/live@1 abstraction.inference/image@1 abstraction.inference/operator@1
Modality and operator methods carry the rules INF-C1–INF-W8; the durable job vocabulary for image and video work is a separate page.
abstraction.resource/table@1 abstraction.resource/leases@1
The table reports who holds how much of a scarce resource under RES-T1–RES-T5; leases ask a holder back on demand under RES-L1–RES-L5 and the wake lease RES-A1.
abstraction.storage/lend@1
The model bridge's lending profile writes into another application's directory on the runtime's behalf under MODELBRIDGE-L1–MODELBRIDGE-L18.
abstraction.config/reader@1 abstraction.config/editor@1 abstraction.config/observer@1
Effective settings, the user location and revision observation carry the rules CFG-E3–CFG-X1.
abstraction.logging/sink@1 abstraction.logging/reader@1 abstraction.logging/observer@1
Submission, retained pages and long-polled observation carry the rules LOG-I1–LOG-S13.
abstraction.facade/resolver@1 abstraction.facade/caller@1 abstraction.facade/endpoint@1 abstraction.facade/registry@1
Endpoint description carries FAC-B1–FAC-B3; provider registrations and binding carry the registry rules FAC-R1–FAC-R8.
abstraction.job/acceptance@1 abstraction.job/operations@1 abstraction.job/inventory@1 abstraction.job/operator@1
Acceptance, reconciliation, cancellation and inventory carry the rules JOB-A1–JOB-W3.
Inference detail
| Capability | Profile | Main methods | Client entry |
|---|---|---|---|
| Chat | abstraction.inference/chat@1 | Start, Observe, Cancel | ResolveInference |
| Embeddings | abstraction.inference/embed@1 | Embed | ResolveEmbeddings |
| Transcription | abstraction.inference/transcription@1 | Start, Observe, Cancel | generated Transcriptions client |
| Speech | abstraction.inference/speech@1 | Start, Observe, Cancel | generated Speech client |
| Live voice | abstraction.inference/live@1 | Start, Append, Observe, Commit, Cancel | generated Live client |
| Images | abstraction.inference/image@1 | Start, Observe, Cancel | generated Image client |
| Operator | abstraction.inference/operator@1 | Hosts, AddHost, RemoveHost, key, audit, and inference gateway methods | ResolveInferenceOperator |
Live voice is the live@1 service. It carries ordered, bounded session events over native IPC. Vendor connections and credentials remain inside the inference service.
Requests and presentation
Applications show ordinary choices in their own UI. OA keeps shared pending and answer state and presents its permission requests. Notifications with actions form a separate planned native surface.
The permission journey connects two identified apps, native consent, a saved rule and an actual credential-bearing operation. Identity binds the calling program, Rights decides access, Asks retains the proposed decision and answer, and the resource service checks and performs the operation. The canonical guide preserves the research basis, accepted one/all scope and finite full-control design; the runnable Windows/macOS playground and human captures remain pending.
Development source for 0.4.0, October 5, 2026. Released 0.3.0 has its own contents and package evidence. Automatic OA ordinary popups are removed; caller-scoped Answer/Dismiss and the Go terminal example are integrated. Fresh native Mac verification and ordinary agent answering remain open.
| Interaction | Example | Owner and state |
|---|---|---|
| App-owned ordinary choice | Replace an output, or choose a model for one request | The application's normal window, CLI or controls. The Go terminal example uses OA's pending/observation/own-answer/replay API. ComfyUI keeps model selection in its existing node controls. |
| OA-owned permission | Allow one program to submit downloads or read a shared resource | OA's native dialog explains requester, recorded publisher, scope, effect and duration. The Windows 11 renderer is integrated, with bounded native guards passed. Final visual acceptance and system/privacy forms remain open. |
| Notification with actions | A completed job offers Open to its Activity record | A compact native notification with attribution and an expiring service-owned action. Public posting/action lifecycle and the complete application journey remain planned. |
Native appearance follows the actual OS version: Windows 10, Windows 11 or AppKit on macOS. The Windows 11 renderer has bounded expanded details and compact chrome. Successful permission answers finish without a second confirmation dialog; failed or uncertain completion retains its report.
Synthetic native lifetime/answer guards and result-report checks passed for the compact Windows 11 source through 957df22bd, using a fake Rights owner. The owner's screenshot shows earlier baseline 3c3b31abf; final appearance of the compact revision remains unaccepted. Keyboard/UIA, cross-monitor DPI/high contrast, Windows 10 appearance, actual owner Mac answering/effect/Undo, lock/unlock, installed login/upgrade and 0.4.0 release qualification remain open.
Planned system access permissions explain a protected system act and use the operating system's administrator approval when required. Planned privacy access permissions explain the device or data capability and follow its platform-specific consent and Settings path. Windows owns actual UAC approval and its secure desktop.
A stable action code and structured resource identify authority. Readable descriptions and display groups explain it. Routine, sensitive and administrative tiers decide who may answer under the existing first-use policy; an administrative OA tier alone supplies no OS elevation requirement. Publisher verification describes recorded identity evidence, with an unverified publisher indicating an evidence gap.
The accepted common permission schema defines explicit operations and typed targets. Source e5c1eebb1 integrates 34 compiled built-in action definitions, the Credentials-owned typed named Use resource and shared native/web first-use explanations. Named Use follows the current account-owned name slot through rotation or recreated registration, under its current host/consumer restrictions.
An isolated native IPC/loopback test passed missing permission → exact caller-bound ask → recorded Allow/applied permit → retry using the named secret. The fixture answered through the operator API; human native interaction retains its separate limits above. Typed one/all selectors, versioned full control, breadth-warning presentation, raw secret Read and the protected OS helper remain unimplemented. Breadth warnings describe scope separately from actual OS elevation.
The Go terminal example prints the full destination, submits its own selection and observes the retained service winner before its guarded output effect. Its suite and Windows redirected-input runtime checks passed; actual console typing remains manual acceptance, and Linux/macOS checks are compile-only.
Ordinary answers select app behavior and grant no OA permission. The proven requester can Answer/Dismiss only its own immutable RequestRef; account-wide answering requires an explicitly authorized operator. Program attribution establishes no human presence. Acknowledge confirms an exact existing answer and relinquishes full service replay. Routine first-use responder enrollment supplies no ordinary answering authority. See ASK-A9, ASK-W5 and ASK-O9 for the current service boundaries.
On-demand desktop Panel
The Panel installs with the runtime and opens as a native window on Windows, macOS and Linux. Each of its sections links to its own anchor below: a "Learn more" link on Windows, a small "?" mark next to the heading on macOS and Linux, and a round "?" button for the current page as a whole. Every anchor names what the section does, the contract rule that decides it, and its command-line equivalent where one exists today.
Rereads the resolved runtime's capability readiness, the call status also makes. Runtime selection and trust follow the rule status and rights both use: an explicit endpoint is never trusted as the installed runtime without its own registration proof.
The runtime is the shared background service every application on this account uses through OpenAbstractions. It runs work in the background, tracks the models and credentials an application may use, and holds the questions it is waiting for you to answer. A pending question appears under Questions and permissions; a download in progress appears under Work.
openabstractions status
Lists the jobs this Panel itself submitted, with each job's current state and display label. A job belongs to the program that submitted it (JOB-A1); this view shows only this Panel's own.
openabstractions jobs list
Lists the jobs every application on this account submitted. Seeing them needs abstraction.job/inventory.read; canceling another app's job needs abstraction.job/acceptance.cancel (JOB-A1).
openabstractions jobs list --all, or jobs cancel --all <id> to cancel one
Lists each app that notified you in the last seven days with its count, beside a switch. Turning an app off sets a block on abstraction.asks/notification.post for it and withdraws its shown notifications; turning it on removes that block. Below are the notifications the runtime holds now and what became of each (ASK-N6).
Submits an HTTP(S) transfer to the runtime's job service by URL, digest and size, and recovers a saved request after a lost reply instead of resubmitting it. A dropped connection keeps its error, and the next attempt resumes from the last proven byte (DL-E1).
openabstractions download <url> --sha256 HEX --size BYTES
Shows pending and past legacy permission requests and ordinary app requests through separate public records. Authorized operators can answer or dismiss them. Ordinary dismissal records a terminal decision without selecting an option or changing permissions. App-owned presentation and its caller-scoped answer route follow the current service boundary.
The hidden session presenter supplies OA permission prompts without a persistent tray or menu-bar icon; the Panel opens on demand. The permission journey explains the native request and its retained effect.
Creates a five-minute, exact-scope permission for one selected executable, one pending first-use question and one answer. It does not answer the question; that application must submit the selected answer. The selected path is a policy subject and does not prove which process is running. If an assistant uses a shared interpreter such as Bun, the permission applies to every program using that interpreter.
No command-line equivalent yet.
Allows or blocks one action for one account and application on one resource, at the policy revision shown. Every decision the runtime makes is checked again at call time under abstraction.rights/authorization@1; a Panel edit leaves a decision already made as it was.
The open view refreshes after another operator changes policy. Unsaved drafts retain their original revision for explicit review. Expiry is checked through current rule reads; time alone does not change the durable policy revision. Applications are checked against these rules every time they act.
The permission journey distinguishes Block, removing one rule and effective access, with broader selectors and fixed full control identified as pending design.
openabstractions rights list, or rights grant
Shows who is using a limited resource on this device right now: the app, the account, how much, and whether it was measured or claimed. Verified rows are measured. A claimed row's amount is 0 unless the row is a lease, and then it is the grant the runtime wrote (RES-T3). A resource named card:<n> can report the same bytes as system memory on shared-memory hardware. A reader never sums two resources, or a verified row with a claimed one (RES-T5).
openabstractions resources
Shows apps and accounts keeping this device from sleeping, with how much, since when, and the lease id; when nothing reports this directly, an older account-scoped reading is shown instead and labeled as such. The wake lease is the one lease rights carries today (RES-A1).
openabstractions resources awake
Lists the model servers this device calls directly for model completions, separate from the gateway keys other apps use to reach it, with whether each is reachable and its spend today against its daily budget; adds or removes a model server. A hosted server's credential is applied to each outgoing request and never cached (INF-C1).
openabstractions inference server list, or inference server add / inference server remove
Turns on the inference gateway, a local proxy other apps on this account can call, so an app that already speaks the OpenAI or Anthropic API reaches this device with no code changes. It listens only on 127.0.0.1, stays off by default, and stays set after a restart. Changing it needs the rule inference server manage (abstraction.inference/host.manage).
openabstractions inference gateway on --address 127.0.0.1:PORT, or inference gateway off
Issues or revokes a gateway key, which lets one other app reach this device through the inference gateway; the key is shown once and this Panel never stores it. A key alone grants nothing: the app still needs inference complete (abstraction.inference/complete) on a model server and permission to apply a hosted server's credential.
openabstractions inference key issue --for PATH, or inference key revoke
Lists every model server the runtime can reach and which app or file registered each one: something you configured, an app's own record, a built-in default, or another trusted runtime.
openabstractions inference server list
Lists every registered provider and its role (a managed process, a model server, or a remote runtime) with its activation, services, endpoint and readiness. Every registration is providers/<name>.json in the runtime's own state (FAC-R1).
openabstractions provider list, or provider add / provider remove
Reads, saves or deletes one named, ordered model preference for this Panel or a selected application. Other-application edits require the separate account-wide selection.manage_for permission. An optional provider value pins a candidate to a logical provider declaration; the runtime still checks caller identity, permission, provider readiness and model availability when the application makes a call.
No command-line equivalent yet.
Lists model servers reported by another trusted runtime in its own domain; their credentials stay on that runtime and are never copied here. Trusting a remote runtime's report follows the same registration rule as a local one (FAC-R1).
No command-line equivalent yet.
Lists every credential registered on this account: its name, kind, status, targets, consumers and where it's used. The secret itself is typed in once and never shown, logged or sent back.
openabstractions credentials list
Registers a name that isn't already in use, scoped to the hosts it may be sent to and the apps allowed to apply it. The credential manager binds the caller the same way for every write (CRED-H1).
openabstractions credentials add <name> --target HOST --for CONSUMER
Replaces the secret and expiry for a name you've already listed, at the revision the list showed.
openabstractions credentials rotate <name>
Deletes the secret right away and keeps a record that it existed, at the revision you've already listed.
openabstractions credentials revoke <name>
Sets whether one app on one account can use a credential, through the rule credentials apply (abstraction.credentials/apply) on that credential; it's the same rule editor as Questions and permissions. Listing and editing it needs this Panel to hold credentials manage (abstraction.credentials/holder.manage) and credentials list (abstraction.credentials/holder.read) (CRED-A2).
openabstractions credentials allow <name> --program PATH, or add --deny
Reads and writes your settings and watches them for later changes. Each value says where it came from: for you, for this device, or for this run. A value's source follows the location order process over user over machine (CFG-R1); an environment variable overrides for that process only, and an empty one is no override (CFG-W3).
Disabled download delegates switches the nas and bits delegates off on this device. The two job directory rows are deprecated. Watching settings for changes does not touch what you are editing. If settings change while you are editing, save your draft first, then read again. Pause, resume, download destinations and host refusal files are set from the openabstractions command line for now.
No command-line equivalent yet.
Reads the runtime's retained log history, filtered by program and level, and can follow new records as they arrive. Each record's hop 0 is the process that wrote it; later hops are what each next service could verify about that write (LOG-I1).
A claim an application makes about itself is unverified. A stamp this runtime's logging service adds itself is verified.
No command-line equivalent yet.
Shows which runtime this device selected, how it bound this Panel's own connection, and what this platform can prove about a caller. A bound attribute is proven by native transport evidence, or left unbound where the platform cannot prove it (ID-B1).
No command-line equivalent yet.
Calls a capability as this Panel and shows the result beside the rights rule that allowed or blocked it, so a grant or a revoke can be tried again without leaving the page. This is the same call probe makes, including a probe marked writes, which asks before it runs.
Grant or revoke the deciding rule for an application directly from a result, then try the call again. This Panel can only act as itself here; to test another application, run a copy of openabstractions named openabstractions-probe under that application's own path.
openabstractions probe <capability> [action]
Compare the APIs
These examples write a structured log event through an already resolved client. Select a language to compare its native API. The calling application handles any returned error or exception.
import (
"context"
"log/slog"
logging "github.com/openabstractions/abstraction-logging/go/client"
)
func recordStart(ctx context.Context, events *logging.Client) error {
return events.LogContext(ctx, int64(slog.LevelInfo), "worker started",
map[string]string{"component": "worker"})
}from datetime import datetime, timezone
from abstraction.logging import Record, Sink
def record_start(events: Sink) -> None:
events.write(Record(
schema=1,
time=datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
level=0,
msg="worker started",
attrs={"component": "worker"},
))#include <abstraction/logging/client.hpp>
void record_start(const abstraction::logging::Logger& events) {
events.log(0, "worker started", {{"component", "worker"}});
}Supply the current UTC timestamp in RFC 3339 format.
use abstraction_logging_api::{Record, Sink};
fn record_start<S: Sink>(events: &S, timestamp: String) -> Result<(), S::Error> {
events.write(Record {
schema: 1,
time: timestamp,
level: 0,
msg: "worker started".into(),
attrs: [("component".into(), "worker".into())].into(),
..Default::default()
})
}import {newRecord} from '@openabstractions/logging';
/** @param {import('@openabstractions/logging').SinkClient} events */
async function recordStart(events) {
const record = newRecord();
record.schema = 1n;
record.time = new Date().toISOString();
record.level = 0n;
record.msg = "worker started";
record.attrs = {component: "worker"};
await events.write(record);
}One-way logging confirms local submission. A storage receipt is not returned. For connection setup, use the language guides. For other operations, open the capability’s generated schema in the API index.
Client languages
API presence and platform qualification differ by language and capability. Check current coverage before choosing a client path.