Skip to content

Commit dc29e89

Browse files
committed
Release 0.2.15
1 parent a613e70 commit dc29e89

55 files changed

Lines changed: 4633 additions & 2018 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.2.15] - 2026-05-21
11+
12+
### Added
13+
- Added Runtime-backed durable bloc prompt-cache control-plane routes under `/api/gateway/blocs/*`, including KV manifest/list/ensure/load/delete/prune helpers for exact-reuse workflows.
14+
- Added Gateway-owned workspace file helper support plus focused route and contract coverage for durable blocs, model residency, notifier behavior, and Runtime-backed capability discovery.
15+
16+
### Changed
17+
- Raised the Runtime floor to `AbstractRuntime[multimodal,mcp-worker]>=0.4.19` and moved Gateway's public provider/media/tool boundary behind Runtime facades rather than direct package imports.
18+
- Updated Apple/GPU install profiles to cascade through Runtime's aggregate extras and excluded internal `tests/`, `flows/`, and backlog notes from source distributions.
19+
- Expanded the docs and capability contract to cover durable blocs, media/model residency, Runtime-backed email/Telegram helpers, and the current Docker/runtime dependency shape.
20+
21+
### Fixed
22+
- Gateway no longer reads AbstractCore config for LLM helper defaults; provider/model resolution now follows request values, Gateway env, and flow defaults with a clear config error when unset.
23+
- Gateway's operator email, Telegram, and notification paths now use Runtime's AbstractCore host facades, while local file/workspace helpers stay owned by Gateway.
24+
- Capability discovery and prompt-cache readiness reporting now better reflect the actual state of generated-media, voice/audio, and provider-backed cache controls.
25+
1026
## [0.2.14] - 2026-05-19
1127

1228
### Fixed

README.md

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Start here: [docs/getting-started.md](docs/getting-started.md)
1515
AbstractGateway is part of the **AbstractFramework** ecosystem:
1616

1717
- **AbstractRuntime** (required): durable run model + workflow registry + stores (`pyproject.toml`, `src/abstractgateway/runner.py`)
18-
- **AbstractCore / AbstractVoice / AbstractVision / AbstractMemory** (required by the default server install): LLM/tool execution, provider-level prompt-cache controls, workflow-backed/direct generated image/voice/audio capabilities, and KG memory used by Gateway bundles (`src/abstractgateway/hosts/bundle_host.py`)
18+
- **AbstractRuntime + transitive capability packages** (required by the default server install): Runtime owns the LLM/tool/media integration boundary; Gateway uses its discovery/run facades for prompt-cache controls, generated image/voice/audio capabilities, and KG-backed bundle execution (`src/abstractgateway/hosts/bundle_host.py`)
1919
- Higher-level UIs (optional): AbstractFlow (authoring/bundling), AbstractCode / AbstractObserver / thin clients (rendering + operations)
2020

2121
Related repos:
@@ -56,24 +56,23 @@ Release images are published to GHCR. The default image is the light,
5656
portable server image:
5757

5858
```bash
59-
docker pull ghcr.io/lpalbou/abstractgateway-server:0.2.8
59+
docker pull ghcr.io/lpalbou/abstractgateway-server:0.2.15
6060
```
6161

6262
NVIDIA hosts can try the experimental full GPU image when local
6363
vLLM/HuggingFace/Diffusers engines are wanted. This image is published
6464
best-effort until it has a real CUDA build and smoke gate:
6565

6666
```bash
67-
docker pull ghcr.io/lpalbou/abstractgateway-server-nvidia:0.2.8
67+
docker pull ghcr.io/lpalbou/abstractgateway-server-nvidia:0.2.15
6868
```
6969

7070
The image installs the base `abstractgateway` package: HTTP server,
71-
`AbstractRuntime[multimodal]`, AbstractCore remote/commercial provider support,
72-
OpenAI-compatible text providers, workflow-backed and direct image generation
73-
through Runtime/Core/AbstractVision, direct Gateway voice/audio endpoints
74-
through AbstractVoice, provider/session prompt-cache helpers, media/tool
75-
helpers, token counting, compression, AbstractMemory/LanceDB KG support,
76-
AbstractAgent, and AbstractFlow compatibility.
71+
`AbstractRuntime[multimodal,mcp-worker]`, Runtime-owned provider/media/tool
72+
facades, OpenAI-compatible text providers, workflow-backed and direct image,
73+
voice, and audio routes surfaced through Runtime, provider/session prompt-cache
74+
helpers, AbstractMemory/LanceDB KG support, AbstractAgent, and AbstractFlow
75+
compatibility.
7776

7877
```bash
7978
export ABSTRACTGATEWAY_AUTH_TOKEN="$(python -c 'import secrets; print(secrets.token_urlsafe(32))')"
@@ -86,7 +85,7 @@ docker run --rm --name abstractgateway-server \
8685
-e OPENAI_COMPATIBLE_BASE_URL="http://host.docker.internal:1234/v1" \
8786
-v "$PWD/runtime/gateway:/data/gateway" \
8887
-v "$PWD/flows/bundles:/data/flows:ro" \
89-
ghcr.io/lpalbou/abstractgateway-server:0.2.8
88+
ghcr.io/lpalbou/abstractgateway-server:0.2.15
9089
```
9190

9291
On Apple Silicon, keep Metal/MLX inference native on macOS and run the
@@ -103,7 +102,7 @@ For a minimal Apple-local Gateway + Flow setup, see
103102

104103
Compose and deployment details: [docs/deployment.md](docs/deployment.md).
105104

106-
## 0.2.8 capability scope
105+
## 0.2.15 capability scope
107106

108107
Direct Gateway APIs in this release:
109108
- `GET /api/gateway/runs/{run_id}/input_data`
@@ -122,9 +121,9 @@ Direct Gateway APIs in this release:
122121
- `/api/gateway/discovery/capabilities` package, plugin, and thin-client contract discovery
123122

124123
Workflow/Core-backed capabilities:
125-
- Generated images are available to Runtime/Core workflows through
126-
AbstractVision when installed and configured, and the direct Gateway image
127-
route uses the same Runtime/Core image-generation contract.
124+
- Generated images are available to Runtime workflows through Runtime's image
125+
backend integrations, and the direct Gateway image route uses the same
126+
Runtime/Core image-generation contract.
128127
- Prompt-cache support depends on the active provider/model. Session lifecycle
129128
routes provide Gateway-owned naming and orchestration, not a provider-
130129
independent local KV cache.
@@ -148,8 +147,8 @@ See [docs/api.md](docs/api.md) for curl examples and the live OpenAPI spec (`/op
148147
Requires Python `>=3.10` (see `pyproject.toml`).
149148

150149
The base install is the remote-light HTTP/SSE server: Gateway, Runtime,
151-
Agent, Core remote provider/tool/media support, Flow compatibility, Vision,
152-
Voice, and LanceDB-backed Memory.
150+
Agent, Flow compatibility, Runtime-owned provider/tool/media facades, and
151+
LanceDB-backed Memory.
153152

154153
```bash
155154
pip install abstractgateway

docker/abstractgateway-server/README.md

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ This image packages the AbstractGateway HTTP/SSE server for durable
44
AbstractRuntime runs:
55

66
```bash
7-
ghcr.io/lpalbou/abstractgateway-server:0.2.8
7+
ghcr.io/lpalbou/abstractgateway-server:0.2.15
88
```
99

1010
Release images are published for `linux/amd64` and `linux/arm64`.
1111
A separate experimental full NVIDIA image is published best-effort for
1212
`linux/amd64`:
1313

1414
```bash
15-
ghcr.io/lpalbou/abstractgateway-server-nvidia:0.2.8
15+
ghcr.io/lpalbou/abstractgateway-server-nvidia:0.2.15
1616
```
1717

1818
The image installs:
@@ -22,13 +22,12 @@ abstractgateway==<version>
2222
```
2323

2424
The default image uses the base remote-light server install. It includes
25-
`AbstractRuntime[multimodal]`, AbstractCore
26-
remote/commercial provider support, OpenAI-compatible text provider routing,
27-
workflow-backed and direct image generation through Runtime/Core/AbstractVision,
28-
direct Gateway voice/audio endpoints through AbstractVoice, provider/session
29-
prompt-cache helpers, KG memory via AbstractMemory/LanceDB, media parsing,
30-
tool helpers, token counting, compression helpers, FastAPI/Uvicorn,
31-
AbstractAgent, and AbstractFlow compatibility. It
25+
`AbstractRuntime[multimodal,mcp-worker]`, Runtime-owned provider/media/tool
26+
facades, OpenAI-compatible text provider routing, workflow-backed and direct
27+
image generation through Runtime, direct Gateway voice/audio endpoints,
28+
provider/session prompt-cache helpers, KG memory via AbstractMemory/LanceDB,
29+
media parsing, tool helpers, token counting, compression helpers,
30+
FastAPI/Uvicorn, AbstractAgent, and AbstractFlow compatibility. It
3231
intentionally does not bundle local model runtimes such as MLX, vLLM,
3332
HuggingFace Transformers, local Diffusers/sdcpp vision backends, or local
3433
voice/music generation engines.
@@ -78,7 +77,7 @@ docker run --rm --name abstractgateway-server \
7877
-v "$PWD/runtime/gateway:/data/gateway" \
7978
-v "$PWD/flows/bundles:/data/flows:ro" \
8079
-v "$PWD/workspace:/workspace" \
81-
ghcr.io/lpalbou/abstractgateway-server:0.2.8
80+
ghcr.io/lpalbou/abstractgateway-server:0.2.15
8281
```
8382

8483
`ABSTRACTGATEWAY_AUTH_TOKEN` is the gateway bearer token. Clients send it as
@@ -97,7 +96,7 @@ docker run --rm --name abstractgateway-server \
9796
-e ABSTRACTGATEWAY_MODEL="your-model" \
9897
-e OPENAI_COMPATIBLE_BASE_URL="http://host.docker.internal:1234/v1" \
9998
-e OPENAI_COMPATIBLE_API_KEY="$OPENAI_COMPATIBLE_API_KEY" \
100-
ghcr.io/lpalbou/abstractgateway-server:0.2.8
99+
ghcr.io/lpalbou/abstractgateway-server:0.2.15
101100
```
102101

103102
Use `http://model-runner.docker.internal/engines/v1` for Docker Model Runner,
@@ -134,17 +133,17 @@ Useful compose variables:
134133
- `ABSTRACTVISION_*`: AbstractVision image backend or OpenAI-compatible image endpoint
135134
- `ABSTRACTVOICE_*`: AbstractVoice TTS/STT backend, local/remote engine, and model controls
136135
- `ABSTRACTGATEWAY_EXTRAS`: build-time install extra for local image builds (empty for the default image, `gpu` for NVIDIA)
137-
- `ABSTRACTGATEWAY_ABSTRACTCORE_SERVER_BASE_URL`: optional standalone Core server for dynamic voice/vision catalogs
136+
- `ABSTRACTCORE_SERVER_BASE_URL`: optional standalone Core server for dynamic voice/vision catalogs
138137

139138
Release scope: TTS, STT, and generated images are direct Gateway endpoints.
140-
Generated images are also available through Runtime/Core workflows with
141-
AbstractVision installed and configured.
139+
Generated images are also available through Runtime workflows with a configured
140+
image backend.
142141

143142
For unreleased local checkouts, build the image from this repository:
144143

145144
```bash
146145
ABSTRACTGATEWAY_INSTALL_MODE=local \
147-
ABSTRACTGATEWAY_IMAGE_TAG=0.2.8-local \
146+
ABSTRACTGATEWAY_IMAGE_TAG=0.2.15-local \
148147
docker compose -f docker/abstractgateway-server/compose.yml up -d --build
149148
```
150149

docker/abstractgateway-server/compose.nvidia.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ services:
22
abstractgateway:
33
# Experimental CUDA overlay. Keep release-grade deployments on compose.yml
44
# until this image has a real CUDA build/smoke gate.
5-
image: ghcr.io/lpalbou/abstractgateway-server-nvidia:${ABSTRACTGATEWAY_IMAGE_TAG:-0.2.8}
5+
image: ghcr.io/lpalbou/abstractgateway-server-nvidia:${ABSTRACTGATEWAY_IMAGE_TAG:-0.2.15}
66
build:
77
context: ../..
88
dockerfile: docker/abstractgateway-server/Dockerfile.nvidia
99
args:
1010
ABSTRACTGATEWAY_INSTALL_MODE: ${ABSTRACTGATEWAY_INSTALL_MODE:-pypi}
11-
ABSTRACTGATEWAY_VERSION: ${ABSTRACTGATEWAY_VERSION:-0.2.8}
11+
ABSTRACTGATEWAY_VERSION: ${ABSTRACTGATEWAY_VERSION:-0.2.15}
1212
ABSTRACTGATEWAY_EXTRAS: ${ABSTRACTGATEWAY_EXTRAS:-gpu}
1313
gpus: all
1414
environment:

docker/abstractgateway-server/compose.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ name: abstractgateway-server
22

33
services:
44
abstractgateway:
5-
image: ghcr.io/lpalbou/abstractgateway-server:${ABSTRACTGATEWAY_IMAGE_TAG:-0.2.8}
5+
image: ghcr.io/lpalbou/abstractgateway-server:${ABSTRACTGATEWAY_IMAGE_TAG:-0.2.15}
66
build:
77
context: ../..
88
dockerfile: docker/abstractgateway-server/Dockerfile
99
args:
1010
ABSTRACTGATEWAY_INSTALL_MODE: ${ABSTRACTGATEWAY_INSTALL_MODE:-pypi}
11-
ABSTRACTGATEWAY_VERSION: ${ABSTRACTGATEWAY_VERSION:-0.2.8}
11+
ABSTRACTGATEWAY_VERSION: ${ABSTRACTGATEWAY_VERSION:-0.2.15}
1212
ABSTRACTGATEWAY_EXTRAS: ${ABSTRACTGATEWAY_EXTRAS:-}
1313
ports:
1414
- "${ABSTRACTGATEWAY_BIND_HOST:-127.0.0.1}:${ABSTRACTGATEWAY_PORT:-8080}:8080"
@@ -31,7 +31,7 @@ services:
3131
ABSTRACTGATEWAY_EMBEDDING_PROVIDER: ${ABSTRACTGATEWAY_EMBEDDING_PROVIDER:-disabled}
3232
ABSTRACTGATEWAY_EMBEDDING_MODEL: ${ABSTRACTGATEWAY_EMBEDDING_MODEL:-}
3333
ABSTRACTGATEWAY_WORKSPACE_DIR: /workspace
34-
ABSTRACTGATEWAY_ABSTRACTCORE_SERVER_BASE_URL: ${ABSTRACTGATEWAY_ABSTRACTCORE_SERVER_BASE_URL:-}
34+
ABSTRACTCORE_SERVER_BASE_URL: ${ABSTRACTCORE_SERVER_BASE_URL:-}
3535
ABSTRACTGATEWAY_ABSTRACTCORE_SERVER_AUTH_TOKEN: ${ABSTRACTGATEWAY_ABSTRACTCORE_SERVER_AUTH_TOKEN:-}
3636
ABSTRACTGATEWAY_CORE_CATALOG_TIMEOUT_S: ${ABSTRACTGATEWAY_CORE_CATALOG_TIMEOUT_S:-}
3737
OPENAI_API_KEY: ${OPENAI_API_KEY:-}

docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Start here if you’re new to the project.
77
AbstractGateway is one component in the larger AbstractFramework ecosystem:
88

99
- **AbstractRuntime** (required): durable runs + stores
10-
- **AbstractCore / AbstractVoice / AbstractVision / AbstractMemory** (required by the default server install): LLM/tool execution, provider-level prompt-cache controls, workflow-backed/direct generated image/voice/audio capabilities, and KG memory used by many bundles
10+
- **AbstractRuntime + transitive capability packages** (required by the default server install): Runtime owns the LLM/tool/media integration boundary; Gateway uses its discovery/run facades for prompt-cache controls, generated image/voice/audio capabilities, and KG-backed bundle execution
1111
- Higher-level UIs (optional): AbstractFlow / AbstractObserver / AbstractCode / thin clients
1212

1313
Related repos:

docs/api.md

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,14 +260,14 @@ Direct Gateway endpoints in this release:
260260
- `GET /api/gateway/vision/provider_models`
261261

262262
The catalog endpoints proxy AbstractCore Server routes when
263-
`ABSTRACTGATEWAY_ABSTRACTCORE_SERVER_BASE_URL` or `ABSTRACTCORE_SERVER_BASE_URL`
263+
`ABSTRACTCORE_SERVER_BASE_URL`
264264
is configured. Gateway uses explicit Core auth settings for that hop and never
265265
reuses the Gateway bearer token as a Core/provider secret. Without a configured
266266
Core server, the voice/model routes return bounded static descriptors from
267267
Gateway and capability-package environment variables.
268268

269-
Generated images are available through Runtime/Core workflows when
270-
AbstractVision is installed and configured. Gateway also exposes a direct image
269+
Generated images are available through Runtime workflows when a compatible
270+
image backend is installed and configured. Gateway also exposes a direct image
271271
generation endpoint that uses the Runtime/Core output-selector contract rather
272272
than a provider-specific image client. The route stores the generated image as a
273273
run artifact and emits `abstract.media.image.generated` with:
@@ -339,6 +339,31 @@ These routes derive a deterministic bounded namespace/key from `session_id`,
339339
provider operation results or a key hint. `rebuild` is clear-plus-prepare for
340340
providers that expose clear controls.
341341

342+
Durable bloc exact-reuse endpoints:
343+
344+
- `POST /api/gateway/blocs/upsert_text`
345+
- `GET /api/gateway/blocs/record`
346+
- `GET /api/gateway/blocs`
347+
- `POST /api/gateway/blocs/delete`
348+
- `GET /api/gateway/blocs/kv/manifest`
349+
- `GET /api/gateway/blocs/kv/list`
350+
- `POST /api/gateway/blocs/kv/ensure`
351+
- `POST /api/gateway/blocs/kv/load`
352+
- `POST /api/gateway/blocs/kv/delete`
353+
- `POST /api/gateway/blocs/kv/prune`
354+
355+
These routes are the primary app-facing durable prompt-cache path:
356+
357+
- create or identify a durable text bloc;
358+
- ensure or load a KV artifact for a target local provider/model;
359+
- use the returned `prompt_cache_binding` in later Runtime-backed generation;
360+
- list/delete/prune artifacts without reaching into provider-private cache state.
361+
362+
They delegate through Runtime's public AbstractCore host facade rather than
363+
proxying Core directly. They are operator-style host controls, so the routes
364+
themselves are not ledgered run execution; the ledgered exact-reuse path is the
365+
later `LLM_CALL.params.prompt_cache_binding` used inside real Runtime runs.
366+
342367
Provider-specific persistence endpoints:
343368

344369
- `GET /api/gateway/prompt_cache/saved`
@@ -386,6 +411,6 @@ Configuration notes (gateway host):
386411
- Single-account env fallback: set `ABSTRACT_EMAIL_IMAP_*` and/or `ABSTRACT_EMAIL_SMTP_*`.
387412
- The secret itself must be present in the env var referenced by `*_PASSWORD_ENV_VAR` (e.g. `EMAIL_PASSWORD=...`).
388413

389-
Evidence: `src/abstractgateway/routes/gateway.py` (`/email/accounts|messages|send`) which proxies to `abstractcore.tools.comms_tools`.
414+
Evidence: `src/abstractgateway/routes/gateway.py` (`/email/accounts|messages|send`) which proxies to the Runtime AbstractCore comms facade.
390415

391416
Troubleshooting and common questions: [faq.md](./faq.md).

docs/architecture.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# AbstractGateway — Architecture
22

3-
> Status: implemented (v0.2.8)
4-
> Last reviewed: 2026-05-10
3+
> Status: implemented (v0.2.15)
4+
> Last reviewed: 2026-05-21
55
66
AbstractGateway is a **durable run gateway** for AbstractRuntime:
77
- **Start runs** (and optionally schedule them)
@@ -15,7 +15,7 @@ This document describes the code in this repository (see **Evidence** links).
1515
AbstractGateway is designed to sit between **thin clients / UIs** and **AbstractRuntime**:
1616
- AbstractGateway: HTTP/SSE API + durability glue + baseline security (`src/abstractgateway/app.py`, `src/abstractgateway/routes/gateway.py`)
1717
- AbstractRuntime (required): run model + tick loop + stores (`pyproject.toml`, `src/abstractgateway/runner.py`)
18-
- AbstractCore / AbstractVoice / AbstractVision / AbstractMemory (required by the default server install): LLM/tool execution, provider-level prompt-cache controls, workflow-backed/direct generated image/voice/audio capabilities, and KG memory used by many bundles (`src/abstractgateway/hosts/bundle_host.py`)
18+
- AbstractRuntime + transitive capability packages (required by the default server install): Runtime owns the LLM/tool/media integration boundary; Gateway uses its discovery/run facades for prompt-cache controls, generated image/voice/audio capabilities, and KG-backed bundle execution (`src/abstractgateway/hosts/bundle_host.py`)
1919

2020
## High-level shape
2121

0 commit comments

Comments
 (0)