Skip to content

Commit ab9756c

Browse files
committed
Fix Gateway 0.2.27 release blockers
1 parent de194e0 commit ab9756c

4 files changed

Lines changed: 29 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2525
- Bundle-mode VisualFlow execution preserves Runtime structured LLM `data` outputs through data edges and Break Object while leaving `response` as text.
2626
- Bundle-mode structured LLM outputs can now drive `Answer User` and `Switch` nodes through `Break Object` without dropping the parsed data payload.
2727
- Gateway now reuses Runtime's published workspace-path and file-filter helpers, and the published package/HTTP app versions are aligned to `0.2.27` while the base/Apple/GPU dependency floor for `abstractagent` stays on the latest PyPI release line.
28+
- Gateway provider/model resolution now falls back to the service store base directory when embedded hosts expose stores without a full host config object, keeping backlog-assist and other hosted endpoints usable in lightweight service contexts.
2829

2930
## [0.2.26] - 2026-06-03
3031

src/abstractgateway/routes/gateway.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -959,12 +959,23 @@ def _resolve_gateway_provider_model_or_400(
959959
model: Optional[str],
960960
purpose: str,
961961
) -> tuple[str, str]:
962+
def _gateway_service_base_dir(service: Any) -> Path:
963+
cfg = getattr(service, "config", None)
964+
data_dir = getattr(cfg, "data_dir", None)
965+
if isinstance(data_dir, (str, Path)) and str(data_dir).strip():
966+
return Path(str(data_dir)).expanduser().resolve()
967+
stores = getattr(service, "stores", None)
968+
base_dir = getattr(stores, "base_dir", None)
969+
if isinstance(base_dir, (str, Path)) and str(base_dir).strip():
970+
return Path(str(base_dir)).expanduser().resolve()
971+
return gateway_data_dir_from_env().expanduser().resolve()
972+
962973
try:
963974
svc = get_gateway_service()
964975
return resolve_gateway_provider_model(
965976
provider=provider,
966977
model=model,
967-
base_dir=Path(svc.config.data_dir),
978+
base_dir=_gateway_service_base_dir(svc),
968979
purpose=purpose,
969980
).require()
970981
except ProviderModelConfigError as e:

tests/test_gateway_console.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import shutil
66
import subprocess
77
import tempfile
8+
from pathlib import Path
89

910
from fastapi.testclient import TestClient
1011
import pytest
@@ -799,5 +800,8 @@ class Element {{
799800
throw new Error("sandbox SFX artifact should render as a blob-backed inline audio player");
800801
}}
801802
"""
802-
result = subprocess.run(["node", "--input-type=module", "-e", harness], capture_output=True, text=True, check=False)
803+
with tempfile.TemporaryDirectory() as tmpdir:
804+
harness_path = Path(tmpdir) / "gateway-console-inline-test.mjs"
805+
harness_path.write_text(harness, encoding="utf-8")
806+
result = subprocess.run(["node", str(harness_path)], capture_output=True, text=True, check=False)
803807
assert result.returncode == 0, result.stderr

tests/test_gateway_visualflow_file_nodes.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,17 @@ def _is_completed():
205205
assert input_data.status_code == 200, input_data.text
206206
workspace_payload = input_data.json().get("workspace") or {}
207207

208-
ledger = client.get(f"/api/gateway/runs/{run_id}/ledger?after=0&limit=500", headers=headers)
209-
assert ledger.status_code == 200, ledger.text
210-
ledger_text = json.dumps(ledger.json().get("items") or [], sort_keys=True)
208+
ledger_payload: dict = {}
209+
210+
def _ledger_contains_pdf_trace():
211+
ledger = client.get(f"/api/gateway/runs/{run_id}/ledger?after=0&limit=500", headers=headers)
212+
assert ledger.status_code == 200, ledger.text
213+
ledger_payload["items"] = ledger.json().get("items") or []
214+
ledger_text = json.dumps(ledger_payload["items"], sort_keys=True)
215+
return "Gateway PDF Report" in ledger_text and "workspace-scoped PDF report" in ledger_text
216+
217+
_wait_until(_ledger_contains_pdf_trace, timeout_s=10.0, poll_s=0.1)
218+
ledger_text = json.dumps(ledger_payload.get("items") or [], sort_keys=True)
211219

212220
workspace = Path(str(workspace_payload.get("workspace_root") or ""))
213221
assert workspace.is_dir()

0 commit comments

Comments
 (0)