AI gateway:
- Add a generic, admin-selectable `client_profile` field on gateway_providers
(e.g. "opencode") so a provider needing special request headers (OpenCode
Zen's client-identity spoofing) is configured like any other provider, not
hardcoded by name.
- Track per-(provider, model) reliability/speed/latency health in memory,
seeded from the existing gateway_usage_ledger at startup - purely
observational, never influences routing.
- New Stats tab on /admin/gateway: request volume, latency, per-model
breakdowns, and reliability weight, charted with a vendored Chart.js and
devplace's own theme tokens.
- Record which model a failed request actually fell back to
(fallback_used_route), surfaced in the Recent Failures table.
- Stop excluding context_length errors from fallback, and skip a primary
attempt outright when its known context window is already too small for
the estimated request size, going straight to the fallback.
- gateway_usage_ledger's provider/fallback_used_route columns and indexes
are ensured centrally in database/schema.py's init_db(), the single point
of truth for this table's schema.
- Non-OpenAI upstream routing and client-model passthrough; trust only the
upstream's own X-Gateway-Model header for served-model attribution.
Devii agent:
- Fix a real lockup: plan/verify tools could be individually disabled via
the admin tool toggles while still being required by the protocol gate,
permanently bricking any task that needed tools. They can no longer be
disabled, and the gate now also checks the tool is actually offered.
- Fix compaction being silently calibrated for a 1M-token model while
running a much smaller one: context budget is now percentage-based and
the summarizer's own request is sized to fit the real model.
- Give a specific, actionable retry message when plan()'s own arguments get
cut off by the output limit, and tighten its schema to discourage
overlong plans.
Other:
- Backup service: offload completed backups to a remote Hetzner Storage Box.
- Container manager: fix orphan blob leaks from sync races, add a two-phase
plan/execute `system prune` CLI command.
- Admin gateway UI: replace the JS-rendered model/provider tables with
server-rendered forms and pages.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhmEkvutuwtzFVcLbTrhdo
Admin-unlimited Dev Workspaces: an admin-owned workspace is now exempt from the
max-workspace-count limit, the max-tunnel-count limit, and the whole
idle-stop/idle-warn/retention-delete lifecycle. Resolved once in
quota.resolve() as Limits.unlimited (owner uid checked against
get_admin_uids()), consumed at the three enforcement points
(provision.ensure, provision.publish_tunnel,
WorkspaceService._advance_lifecycle). Also hardens
get_admin_uids()/get_primary_admin_uid() against a partially-schemaed users
table (uid/role column guard), which a fresh test/init_db() path could hit.
AI gateway per-model automatic fallback: any gateway_models route
(chat/embed/image) can now name a fallback_model, picked on /admin/gateway
from a select box of other configured public model names of the same kind
only (never an internal upstream model id). When a route fails after its own
retries are exhausted, the gateway retries once, automatically, against the
fallback's own provider/pricing/key, before any bytes reach the client
(including for a streaming response). One hop only, no chains or cycles;
self-reference and cross-kind fallbacks are rejected at write time.
AI gateway real upstream streaming and thinking-default control: stream:true
is now forwarded to the upstream and relayed to the client as real SSE
chunks (measured TTFT/inter-token latency) instead of a simulated split
response, and every chat/vision call explicitly disables model "thinking" by
default (admin-overridable via gateway_thinking), with per-dialect handling
for DeepSeek, OpenRouter, and Ollama.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TjdKTWgWpW2SMNW8SFqxz5
- Add `ai_grade`, `featured`, `featured_locked`, `landing_locked`, `author`, `article_published`, `image_url`, `has_unique_image` columns to news table
- Extend `news_images` schema with `alt_text`, `phash`, `width`, `height`, `is_placeholder` columns
- Create `idx_news_featured` index for efficient featured queries
- Update admin toggle endpoints to set `featured_locked`/`landing_locked` when manually toggling
- Propagate `featured` and `image_url` fields through landing page, news list, and detail page rendering
- Update `get_featured_news` to return `featured` and `image_url` fields
- Document in AGENTS.md the full zero-maintenance pipeline: image perceptual hashing, placeholder detection, AI grading on cleaned text, reliability gate, effective score computation, and post-loop landing rotation
- Update README.md service description to reflect automatic image comparison and landing rotation capabilities
- Clarify docs_api.py summaries that toggling featured/landing now locks articles from auto-rotation