Skip to content

Commit 8eabf50

Browse files
committed
Release 0.2.27
1 parent eb0f260 commit 8eabf50

36 files changed

Lines changed: 5199 additions & 510 deletions

CHANGELOG.md

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

88
## [Unreleased]
99

10+
## [0.2.27] - 2026-06-06
11+
12+
### Added
13+
- Added `POST /api/gateway/runs/{run_id}/images/upscale`, backed by Runtime's durable `AbstractCoreRunFacade.upscale_image(...)` child-run path.
14+
- Added `upscaled_image` media capability/readiness contract entries and `task=image_upscale` Vision provider-model discovery.
15+
- Added `GET /api/gateway/vision/adapters`, backed by Runtime's public discovery facade, so thin clients can query compatible installed adapters for image/video tasks.
16+
- Direct image/video routes now return plural artifact fields (`image_artifacts`, `video_artifacts`) for batch generation while preserving the existing singular compatibility fields.
17+
18+
### Changed
19+
- Raised the Runtime floor to `AbstractRuntime>=0.4.28` across Gateway base, Apple, and GPU profiles so Gateway installs always include the Runtime `read_pdf` / `write_pdf` nodes and their permissive `pypdf` / `reportlab` dependencies.
20+
- Forwarded newer Runtime/Core/Vision request controls such as image/video batch `count` / `n`, `seeds`, ordered `lora_adapters`, video `flow_shift`, and image-upscaler parameters through Gateway direct media routes.
21+
- Raised the `abstractcore[embeddings]` optional profile floor to `>=2.13.37`, matching Runtime's Core floor used by the base, Apple, and GPU Gateway profiles.
22+
23+
### Fixed
24+
- Added Gateway bundle execution coverage for writing a real PDF artifact, reading it back through Runtime's PDF node, and exposing the extracted text through `On Flow End`.
25+
- Bundle-mode VisualFlow execution preserves Runtime structured LLM `data` outputs through data edges and Break Object while leaving `response` as text.
26+
- Bundle-mode structured LLM outputs can now drive `Answer User` and `Switch` nodes through `Break Object` without dropping the parsed data payload.
27+
1028
## [0.2.26] - 2026-06-03
1129

1230
### Added

README.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,15 @@ Release images are published to GHCR. The default image is the light,
119119
portable server image:
120120

121121
```bash
122-
docker pull ghcr.io/lpalbou/abstractgateway:0.2.25
122+
docker pull ghcr.io/lpalbou/abstractgateway:0.2.27
123123
```
124124

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

129129
```bash
130-
docker pull ghcr.io/lpalbou/abstractgateway:0.2.25-gpu
130+
docker pull ghcr.io/lpalbou/abstractgateway:0.2.27-gpu
131131
```
132132

133133
Legacy `abstractgateway-server` and `abstractgateway-server-nvidia` GHCR aliases
@@ -205,6 +205,7 @@ Current direct Gateway APIs:
205205
- `POST /api/gateway/runs/{run_id}/audio/transcribe`
206206
- `POST /api/gateway/runs/{run_id}/images/generate`
207207
- `POST /api/gateway/runs/{run_id}/images/edit`
208+
- `POST /api/gateway/runs/{run_id}/images/upscale`
208209
- `POST /api/gateway/runs/{run_id}/videos/generate`
209210
- `POST /api/gateway/runs/{run_id}/videos/from_image`
210211
- `POST /api/gateway/runs/{run_id}/music/generate`
@@ -215,8 +216,11 @@ Current direct Gateway APIs:
215216
- `GET /api/gateway/audio/music/models`
216217
- `GET /api/gateway/vision/provider_models`
217218
- `GET /api/gateway/vision/models`
219+
- `GET /api/gateway/vision/adapters`
218220
- `/api/gateway/artifacts/search` cross-run/session/run artifact search with
219-
modality, content-type, text, and tag filters
221+
canonical `artifact_envelope_v1` rows, exact stats/facets, bounded paging,
222+
descriptor filters, and UI-friendly `artifact_kind` filtering for
223+
Voice/Music/Sound/unclassified audio and text/media render kinds
220224
- `/api/gateway/prompt_cache/*` provider/model operator controls
221225
- `/api/gateway/prompt_cache/saved|save|load` Runtime-backed host-local export/import admin aliases
222226
- `/api/gateway/sessions/{session_id}/prompt_cache/*` session lifecycle controls
@@ -243,11 +247,19 @@ Workflow/Core-backed capabilities:
243247
progress through `abstract.progress` ledger records; image progress is
244248
best-effort and may be limited to start/complete for backends that do not
245249
report step progress.
250+
- Direct image/video requests preserve task-specific batch and adapter fields:
251+
`count` / `n`, `seeds`, ordered `lora_adapters`, and video `flow_shift`.
252+
Batch responses keep compatibility singular fields (`image_artifact`,
253+
`video_artifact`) and also return the full `image_artifacts` /
254+
`video_artifacts` lists.
246255
- Generated music is available through Gateway's direct Runtime-backed child-run
247256
route, with provider/model discovery exposed through Gateway capability
248257
contracts and music catalog endpoints for higher apps.
249258
- Catalog routes now return a canonical `items` array and a `catalog` metadata
250259
block so higher apps can stop parsing route-local payload variants.
260+
- Vision adapter discovery is available through
261+
`GET /api/gateway/vision/adapters`, routed through Runtime's public discovery
262+
facade.
251263
- Audio transcription is available through a direct Runtime-backed child-run
252264
route, and the capability contract also exposes `voice.listen` as a
253265
host-capture command surface for higher apps that record locally before

docker/abstractgateway-server/README.md

Lines changed: 3 additions & 3 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:0.2.25
7+
ghcr.io/lpalbou/abstractgateway:0.2.27
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:0.2.25-gpu
15+
ghcr.io/lpalbou/abstractgateway:0.2.27-gpu
1616
```
1717

1818
Legacy aliases `ghcr.io/lpalbou/abstractgateway-server:*` and
@@ -176,7 +176,7 @@ For unreleased local checkouts, build the image from this repository:
176176

177177
```bash
178178
ABSTRACTGATEWAY_INSTALL_MODE=local \
179-
ABSTRACTGATEWAY_IMAGE_TAG=0.2.25-local \
179+
ABSTRACTGATEWAY_IMAGE_TAG=0.2.27-local \
180180
docker compose -f docker/abstractgateway-server/compose.yml up -d --build
181181
```
182182

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:${ABSTRACTGATEWAY_NVIDIA_IMAGE_TAG:-0.2.25-gpu}
5+
image: ghcr.io/lpalbou/abstractgateway:${ABSTRACTGATEWAY_NVIDIA_IMAGE_TAG:-0.2.27-gpu}
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.25}
11+
ABSTRACTGATEWAY_VERSION: ${ABSTRACTGATEWAY_VERSION:-0.2.27}
1212
ABSTRACTGATEWAY_EXTRAS: ${ABSTRACTGATEWAY_EXTRAS:-gpu}
1313
gpus: all
1414
environment:

docker/abstractgateway-server/compose.yml

Lines changed: 2 additions & 2 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:${ABSTRACTGATEWAY_IMAGE_TAG:-0.2.25}
5+
image: ghcr.io/lpalbou/abstractgateway:${ABSTRACTGATEWAY_IMAGE_TAG:-0.2.27}
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.25}
11+
ABSTRACTGATEWAY_VERSION: ${ABSTRACTGATEWAY_VERSION:-0.2.27}
1212
ABSTRACTGATEWAY_EXTRAS: ${ABSTRACTGATEWAY_EXTRAS:-}
1313
ports:
1414
- "${ABSTRACTGATEWAY_BIND_HOST:-127.0.0.1}:${ABSTRACTGATEWAY_PORT:-8080}:8080"

docs/api.md

Lines changed: 135 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ curl -sS -H "$AUTH" -H "Content-Type: application/json" \
8383

8484
Evidence: request/response models live in `src/abstractgateway/routes/gateway.py` (`StartRunRequest`, `start_run`).
8585

86+
For VisualFlow bundles, Gateway runs the packed JSON through AbstractRuntime.
87+
Structured LLM/Agent schemas are Runtime/Core-owned: `response` remains textual,
88+
and schema-conformant object values are available through the node `data` output
89+
for data edges such as Break Object and Switch.
90+
8691
### 2b) Schedule a run (bundle mode)
8792

8893
`POST /api/gateway/runs/schedule` starts a **scheduled parent run** that launches the target workflow as child runs over time.
@@ -194,6 +199,34 @@ raw bytes or local paths:
194199
}
195200
```
196201

202+
Gateway uses three distinct file-like source terms:
203+
204+
- `Artifact`: a durable runtime-owned payload reference.
205+
- `Local File`: a browser/client upload source. Hosted clients should upload
206+
bytes; browser-local paths are never interpreted as server paths.
207+
- `Server File` / `Server Folder`: user-facing wording for a workspace-scoped
208+
server path under Gateway policy. The engineering contract is the canonical
209+
`WorkspacePath` string returned by `/files/*`, artifact import/export, and
210+
Runtime file nodes.
211+
212+
Hosted local uploads stay artifact-backed:
213+
214+
- one local file upload creates one artifact ref;
215+
- multiple local files create an ordered list of artifact refs in Flow;
216+
- a local folder uploads one artifact per file and may send `source_path`
217+
(for example `reports/2026/summary.md`) so relative member paths survive in
218+
artifact provenance without exposing browser-local absolute paths.
219+
220+
Upload a local file or folder member:
221+
222+
```bash
223+
curl -sS -H "$AUTH" \
224+
-F "session_id=sess-1" \
225+
-F "source_path=reports/summary.md" \
226+
-F "file=@./summary.md" \
227+
"$BASE_URL/api/gateway/attachments/upload"
228+
```
229+
197230
List run artifacts:
198231

199232
```bash
@@ -206,19 +239,76 @@ List artifacts visible to a session:
206239
curl -sS -H "$AUTH" "$BASE_URL/api/gateway/sessions/sess-1/artifacts"
207240
```
208241

242+
Browse server workspace files/folders:
243+
244+
```bash
245+
curl -sS -H "$AUTH" \
246+
"$BASE_URL/api/gateway/files/list?path=&include_directories=true&limit=200"
247+
```
248+
249+
Optional filters:
250+
- `path`: browse a specific workspace folder or mount alias.
251+
- `recursive=true`
252+
- `family=image|video|audio|document|text|code|json|archive|other`
253+
- `extensions=png,jpg` or newline-separated values
254+
- `query=substring`
255+
- `max_depth=<n>`
256+
209257
Search artifacts across Gateway storage:
210258

211259
```bash
212260
curl -sS -H "$AUTH" \
213-
"$BASE_URL/api/gateway/artifacts/search?scope=all&modality=image&query=logo&tags=pin_id=image"
261+
"$BASE_URL/api/gateway/artifacts/search?scope=all&artifact_kind=image&query=logo&tags=pin_id=image&include_stats=true&limit=500"
214262
```
215263

216264
`scope` can be `all`, `session`, or `run`. Use `session_id` with
217265
`scope=session` and `run_id` with `scope=run`; omit both for `scope=all`.
218-
`modality` filters normalized artifact type (`image`, `audio`, `video`,
219-
`text`, `document`, `music`, `voice`, or `artifact`), `content_type` accepts
220-
exact values or prefixes such as `image/*`, and `tags` accepts either a JSON
221-
object or comma-separated `key=value` filters.
266+
Search responses preserve the legacy row fields and also include
267+
`artifact_envelope_v1`, a normalized projection of Runtime-owned descriptors,
268+
access stats, and Gateway action links.
269+
270+
Useful query parameters:
271+
- `artifact_kind`: UI-oriented kind filter. Comma-separated values match
272+
`semantic_kind`, `render_kind`, or `modality`; generic `audio` means
273+
unclassified audio and does not match canonical `voice`, `music`, or `sound`.
274+
Single canonical kinds such as `music`, `voice`, `image`, `markdown`, or
275+
`json` map to Runtime catalog filters. Multi-kind unions are supported, but
276+
may be Gateway post-filters until Runtime exposes OR filters.
277+
- `semantic_kind` / `render_kind`: canonical descriptor filters when the caller
278+
wants the two dimensions separately.
279+
- `modality`, `content_type`, `workflow_id`, `node_id`, `created_after`,
280+
`created_before`, and `tags`: server filters for indexed descriptor fields.
281+
- `query`: case-insensitive metadata search. Gateway may post-filter this field
282+
when Runtime cannot index it directly.
283+
- `include_stats=true`: include exact `stats.total`, byte totals, and facet
284+
counts for the selected server-side filter set, independent of `limit`.
285+
- `limit`, `offset`, and `cursor`: bounded paging. The default Runtime Explorer
286+
page size is 500; `limit<=0` is bounded unless `debug_unlimited=true` is used
287+
by an admin/debug caller.
288+
289+
`artifact_envelope_v1` contains normalized fields such as `semantic_kind`,
290+
`render_kind`, `workflow_id`, `node_id`, `turn_id`, `ledger_cursor`,
291+
`generation`, `producer`, `media`, `source_refs`, `access`, and `links`.
292+
Sparse producer metadata is represented as missing fields; Gateway does not
293+
invent provider/model provenance from filenames.
294+
295+
Generated-media artifacts created by child runs and projected into the parent
296+
run preserve Runtime descriptors and structured metadata. Direct transcription
297+
routes store transcript artifacts with source-audio refs, language/prompt hints,
298+
provider/model when available, and bounded route parameters.
299+
Descriptor-provided action links are sanitized to relative Gateway/UI links
300+
before they appear in envelopes; raw external provider URLs should be represented
301+
as trace availability or Gateway-owned trace records.
302+
303+
Content reads can label the access type for Runtime access stats:
304+
305+
```bash
306+
curl -sS -H "$AUTH" \
307+
"$BASE_URL/api/gateway/runs/<run_id>/artifacts/<artifact_id>/content?access_action=preview"
308+
```
309+
310+
Supported access actions are `content`, `preview`, and `download`. The shorter
311+
`access=preview` alias is also accepted.
222312

223313
Import a server workspace path into a session artifact:
224314

@@ -245,6 +335,12 @@ workspace import/export and `/files/*` helpers require an admin principal.
245335
Ordinary users can still upload browser-local files and list/search artifacts in
246336
their own routed runtime.
247337

338+
Canonical Gateway server paths use `rel/path` for the main workspace root and
339+
`mount_alias/rel/path` for approved mounts. When two allowed mounts share the
340+
same basename, Gateway emits deterministic digest-suffixed aliases so the same
341+
public path string can round-trip through `/files/*`, artifact import/export,
342+
and Runtime file nodes.
343+
248344
## Durable commands (`POST /api/gateway/commands`)
249345

250346
Commands are appended to a durable inbox and applied asynchronously by the runner.
@@ -336,8 +432,9 @@ It also includes a versioned thin-client contract:
336432
- `capabilities.contracts.common`: shared run start/list/summary/input/history,
337433
ledger, artifact, attachment, workspace, discovery, and provider prompt-cache
338434
controls. `common.artifacts` includes run listing/content, session artifact
339-
listing, artifact search, workspace import, and workspace export descriptors
340-
when available. Permission-sensitive descriptors are principal-aware:
435+
listing, artifact search with `artifact_envelope_v1`, exact stats/facets,
436+
`artifact_kind` UI filtering, workspace import, and workspace export
437+
descriptors when available. Permission-sensitive descriptors are principal-aware:
341438
ordinary users see admin-only workspace import/export and provider
342439
prompt-cache controls marked unavailable with `admin_required` metadata.
343440
- `capabilities.contracts.common.readiness`: compact Gateway-owned
@@ -408,6 +505,7 @@ Current direct Gateway endpoints:
408505
- `POST /api/gateway/runs/{run_id}/audio/transcribe`
409506
- `POST /api/gateway/runs/{run_id}/images/generate`
410507
- `POST /api/gateway/runs/{run_id}/images/edit`
508+
- `POST /api/gateway/runs/{run_id}/images/upscale`
411509
- `POST /api/gateway/runs/{run_id}/videos/generate`
412510
- `POST /api/gateway/runs/{run_id}/videos/from_image`
413511
- `POST /api/gateway/runs/{run_id}/music/generate`
@@ -417,6 +515,7 @@ Current direct Gateway endpoints:
417515
- `GET /api/gateway/audio/music/providers`
418516
- `GET /api/gateway/audio/music/models`
419517
- `GET /api/gateway/vision/provider_models`
518+
- `GET /api/gateway/vision/adapters`
420519

421520
The catalog endpoints proxy AbstractCore Server routes when
422521
`ABSTRACTCORE_SERVER_BASE_URL`
@@ -449,8 +548,10 @@ stores the generated image as a run artifact, and returns
449548
for progress:
450549

451550
- `run_id`, `request_id`, `prompt`
452-
- optional `provider`, `model`, `size`, `width`, `height`, and `format`
453-
- `image_artifact`: `{"$artifact", "content_type", "filename", "sha256", "size_bytes"}`
551+
- optional `provider`, `model`, `size`, `width`, `height`, `format`, batch
552+
`count` / `n`, `seeds`, and ordered `lora_adapters`
553+
- `image_artifact`: first generated image for compatibility
554+
- `image_artifacts`: full ordered image artifact list for batch generation
454555

455556
`size`, `width`, and `height` are optional passthrough request overrides. Do
456557
not inject a client-side default size. Different image providers/models accept
@@ -468,12 +569,27 @@ Gateway also exposes a direct image-edit sibling route:
468569
- `POST /api/gateway/runs/{run_id}/images/edit`
469570

470571
The request uses a source `image_artifact`, optional `mask_artifact`, the same
471-
provider/model and image backend selectors as image generation, and returns an
472-
artifact-backed edited image. Thin clients should feature-detect it from
572+
provider/model and image backend selectors as image generation, plus optional
573+
batch `count` / `n`, `seeds`, and ordered `lora_adapters`, and returns an
574+
artifact-backed edited image. Batch responses also return `image_artifacts`.
575+
Thin clients should feature-detect it from
473576
`capabilities.contracts.flow_editor.media.edited_image` or
474577
`capabilities.contracts.assistant.media.edited_image`. It uses the same
475578
child-run `abstract.progress` progress contract as direct image generation.
476579

580+
Gateway also exposes a direct image-upscale sibling route:
581+
582+
- `POST /api/gateway/runs/{run_id}/images/upscale`
583+
584+
The request uses a run-visible source `image_artifact`, optional provider/model
585+
selectors, and optional upscaler controls such as `scale`, `resolution`,
586+
`softness`, `seed`, `quantize`, and `vae_tiling`; `resolution` may be a
587+
shortest-edge integer or a scale factor such as `2x`. Thin clients should
588+
feature-detect it from `capabilities.contracts.flow_editor.media.upscaled_image`
589+
or `capabilities.contracts.assistant.media.upscaled_image`, list models with
590+
`GET /api/gateway/vision/provider_models?task=image_upscale`, and stream the
591+
returned child-run ledger for `abstract.progress` events.
592+
477593
Generated music follows the same direct child-run pattern. Thin clients should
478594
discover it from `capabilities.contracts.flow_editor.media.generated_music` or
479595
`capabilities.contracts.assistant.media.generated_music`, list providers/models
@@ -483,16 +599,20 @@ from the music catalog routes, and treat the returned `child_run_id` plus
483599
Generated video also follows the direct child-run pattern:
484600

485601
- `POST /api/gateway/runs/{run_id}/videos/generate` uses the Runtime/Core
486-
`output.modality=video` / `task=text_to_video` contract.
602+
`output.modality=video` / `task=text_to_video` contract and accepts optional
603+
batch `count` / `n`, `seeds`, ordered `lora_adapters`, and `flow_shift`.
487604
- `POST /api/gateway/runs/{run_id}/videos/from_image` accepts a run-visible
488-
source `image_artifact` and uses `task=image_to_video`.
605+
source `image_artifact`, accepts the same optional batch/adapter/video
606+
control fields, and uses `task=image_to_video`.
489607
- Thin clients should discover these routes from
490608
`capabilities.contracts.flow_editor.media.generated_video` and
491609
`capabilities.contracts.flow_editor.media.image_to_video` (or the matching
492610
`assistant.media.*` entries), use
493611
`GET /api/gateway/vision/provider_models?task=text_to_video|image_to_video`
494-
for model catalogs, and stream the returned `child_run_id` ledger for
495-
`abstract.progress` events.
612+
for model catalogs, use `GET /api/gateway/vision/adapters` for compatible
613+
installed adapter catalogs, stream the returned `child_run_id` ledger for
614+
`abstract.progress` events, and read `video_artifacts` when batch generation
615+
is requested.
496616

497617
STT and listen contract notes:
498618

0 commit comments

Comments
 (0)