Releases: alrcatraz/astra-aigate
Release list
v0.6.1
astra-aigate v0.6.1
Bug-fix release for the self-hosted PostgreSQL run mode.
Fixed
-
Async proxy guards never awaited — the DatabaseAdapter PreparedStatement .get()/.all() returns a Promise, but the three proxy guards (hasBlockingProxyAssignment, hasBlockingProxyAssignmentForProvider, isGlobalProxyEnabled) consumed the results without await. The result: Promise was truthy, so every DIRECT-only provider was rejected with PROXY_ASSIGNED_UNAVAILABLE even with zero proxy-assignment rows, and the provider-level guard inverted the fault, never failing closed. Guards are now async and await every read through getAsyncDb(). The PG-mode scratch .raw is guarded too, so 'no such table: domain_budgets' no longer escapes as an unhandledRejection and loadCostTotal degrades to 0 instead of throwing.
-
Postgres dialect mangled datetime('now') on ON CONFLICT DO UPDATE RHS — rewriteConflictAssignments qualified every bare identifier on the right-hand side, so datetime('now') got a table prefix and was mis-translated into to_timestamp('user_levels.now'), making Postgres fail every gamification upsert with 'schema "user_levels" does not exist'. The qualifier now skips function calls (identifier followed by paren) and quoted strings, so NOW()/datetime('now') survive intact while bare-column sliding counters (consumed = consumed + EXCLUDED.consumed) still get the required table qualification.
Chore
- Version bump 0.6.0 -> 0.6.1 + CHANGELOG entry.
v0.6.0
What's new
Dual-currency billing (USD/CNY)
- Cost accrue per provider's real billing currency; analytics summary now carries totalCostUsd / totalCostCny / costCurrency / fxRateUsdCny
- USD/CNY toggle across cost dashboards (persisted to localStorage)
camofox gateway integration
- Reverse-proxy duplex fix: streaming POST /api/svc/ no longer errors
- camofox service hardened: bearer auth + required_scope=svc:camofox
Reliability
- PG-safe key-permission transactions: scopes update now uses db.transaction() instead of SQLite-only BEGIN IMMEDIATE (fixes 'Failed to update permissions' under DB_DRIVER=postgres)
- PostgresDialect translates BEGIN IMMEDIATE/EXCLUSIVE/DEFERRED → PG BEGIN
Full commits
- 27ff3cc chore: release 0.6.0 — dual-currency billing + camofox gateway
- 1cb96f2 fix(svc,db): camofox duplex proxy + PG-safe transactions for key permissions
- 6203df7 test(usage): unit test coverage for dual-currency billing and cost-currency toggle
- 89d0a0f feat(ui): USD/CNY cost toggle across cost dashboards
- 34e4e5d feat(usage): dual-currency billing (USD/CNY) for cross-provider cost summary
v0.5.3
Fixes
- PG upserts qualify RHS columns; quota timestamps widened to bigint
- DeepSeek quota fetcher bypasses 60s cache when forced
- Combo-health: quote CTE aliases, point routing stats at usage_history
- Cache health & circuit-breaker reads async-ified, health route hardened
Full commits
- e9129ad chore(version): bump to 0.5.3
- b1a55e8 fix(health): async-ify cache health and circuit-breaker reads, harden health route
- 7a89a30 fix(health): quote CTE aliases in combo-health and point routing stats at usage_history
- d89e855 fix(usage): thread force through deepseek quota fetcher to bypass 60s cache
- e016607 fix(db): qualify RHS columns in PG upserts and widen quota timestamps to bigint
v0.5.2
Bug-fix release: on self-hosted PG deployments the provider-limits
(balance/quota) cache froze, sync 500'd, and the dashboard read an empty
map even though rows were present in Postgres. Also fixes a 503 admission
regression from tight heavy-request limits.
Fixed
- Cloud-detection short-circuit: the probe (
typeof globalThis.caches === "object") fired on every standalone server because Next 16 polyfills the
Web Cache API, making balance/limit cache reads return empty and writes
silently no-op. Cloud semantics now require the edge runtime
(NEXT_RUNTIME=nodejsexcluded) or explicitOMNIROUTE_CLOUD=true. - SiliconFlow balance guard: the
/v1/user/infopayload now reports a
degenerate all-string-zero shape as unavailable instead of a genuine 0
balance. INSERT OR REPLACEupsert broke under webpack module duplication: the
Postgres adapter (and its module-scoped pk-cache) is bundled into several
chunks, each holding its own copy; a route served through a different chunk
held a cold pk-cache and degraded toON CONFLICT DO NOTHING, so
already-cached connections never updated. Each adapter now warms its pk-cache
lazily on first use and re-translates to a realON CONFLICT (...) DO UPDATE.- Named-placeholder regression: the adapter rework dropped the SQL rewrite
mapping named SQLite placeholders (@name/:name) to positional$N, so
queries likeis_active = @isActivehit Postgres withcolumn "isactive" does not existand provider-limits sync returned 500.buildBindernow
returns both the positional SQL and the binder. - Read path surfaced an empty map:
getSanitizedCachedProviderLimitsMap
consumedawait getAllProviderLimitsCache()synchronously (noawait), so
Object.keys(caches)ran against a Promise and the map degraded to{}
even though rows were present in Postgres. - Admission lease TTL: the chat heavyweight admission lease is now
force-released after a configurable TTL
(OMNIROUTE_CHAT_HEAVY_LEASE_TTL_MS, default 10 min) as a defensive
backstop against a stuck upstream SSE stream permanently occupying one of
the heavy in-flight slots, which would otherwise push legitimate concurrent
heavy traffic into retryable 503s (chat_admission_busy).
Full Changelog: v0.5.1...v0.5.2
v0.5.1
Context windows (cross-provider)
- dmxapi deepseek-v4-flash-0731: resolve 1M context via model spec alias (API exposes no context metadata)
- zhipu/zai GLM mappings now resolve context windows (glm-4.7-flash 200K, glm-4.6v 128K)
Chat admission (503 fix)
- Heavy-request tool threshold 64 -> 400: normal coding traffic (~366 tools) no longer occupies the single heavy slot
- Heavy in-flight capacity 1 -> 3: true heavy requests can run in parallel
- Fixes intermittent HTTP 503 "Chat admission capacity is temporarily unavailable" on large/main combo requests
Combos
- New model steps default weight 1 (weighted strategy selects them; DB rows backfilled)
Chore
- Version bump 0.5.1; CHANGELOG updated
v0.5.0
Skill Hub
- Multi-source skill aggregation: git repos (tarball), SSH hosts, built-in catalogs
- Source registration, discover/install, dependency-aware artifact packaging
- Skill sources dashboard page + /api/skills sources/artifacts routes + DB migration 138
- Sidebar order: LLM → Skill → MCP → services
Fixes
- combos: manual/batch model additions default weight 1 (weighted strategy now selects them)
- db: feature-flag sync awaited; PG bootstrap connectivity wait; schema regex fix
Docs
- WebSocket troubleshooting runbook (docs/reference/WS_TROUBLESHOOTING.md)
Chore
- Privacy scrub of internal host names/IPs; .gitignore db_backups/
v0.4.4
v0.4.4 — PG 模式收敛 + 空对象修复
媒体提供商列表、combo 构建、WebSocket 绑定、权限同步的四类问题全数修复,并定位/修复媒体模型列表空对象的系统性根因。
Fixed
- WS 绑定:绑定 0.0.0.0 时自动接受 loopback/LAN origin(Combo Studio「实时已禁用」修复)
- 模型静默丢失(Systematic Async bug):
getModelIsHidden等 async 检查未 await,导致 provider 模型被静默 drop - 同型 async bug:key 权限/别名同步、combo builder、synced models 的 async 未 await 检查
- 空对象根因(最关键):
catalogResponse.ts的enrichCatalogModelEntry(async)在array.map里未 await,被序列化成{},导致/v1/providers/{id}/models的owned_byfilter 得 0、媒体页 embedding 只显示一种。修复后/v1/models1361 模型 0 空对象,硅基流动 embedding 全显(含 bge-m3) - 媒体 UI 同步:provider detail/card 的 service-kind UI 与 media registries 对齐
Chore
- 版本 bump 0.4.4
- CHANGELOG 补 v0.4.4 正式发布记录
验证
- PG 模式
/v1/models=1361 全非空、combo 48 个、WS 0.0.0.0:20132、searxng/camofox up - 双端推送(gitea + github)
v0.4.3
v0.4.3 — DMXAPI 发现 + combo 修复
Added
- DMXAPI 全家族站点注册
Fixed
- combo 构建:hidden/capability 查询未 await 导致 builder 在 PG 模式下列表模型失败
- synced models 持久化的 async deleted-check 未 await
- v1 chat 管线:conversation 完整性保持 + translator 同步 capability access
- authz:
/api/svc/*经 PUBLIC 通道匿名服务 - usage:credit-balance provider 的 remainingPercentage
- gateway:合法响应头 + PG-safe COLLATE NOCASE
- chat:同步 cache accessor、structuredClone 防非可克隆 Promise
Docs & Build
- host-network 部署约束记录;opencode Free tier 走 no-auth 端点
v0.4.1
v0.4.1 — v1 chat 管线修复
Fixed
- v1 chat 管线:conversation 完整性保持 + translator 同步 capability access
- registry:opencode Free tier 是 no-auth 端点
- usage:credit-balance provider 的 remainingPercentage
- chat:同步 cache accessor
- chat:structuredClone 防非可克隆 Promise payload
- gateway:合法响应头 + PG-safe COLLATE NOCASE