Commit Graph

263 Commits

Author SHA1 Message Date
Chris Staley
2341bba973 feat(gemini): progress dialog on key save, remove hardcoded registry, categorize by endpoint
- Show import progress dialog when adding Gemini API key with model
  list, completion status, and Close button
- Remove hardcoded Gemini model registry — models come exclusively
  from Google API sync per API key
- Hide "Import from /models" button for Gemini (sync handles it)
- Remove server-side fire-and-forget auto-sync (client handles it)
- Categorize synced Gemini models by endpoint type in catalog:
  embedding, image, and audio (transcription + speech)
- Add modelsImported and close i18n keys to all 33 languages
2026-04-02 14:38:28 -06:00
Chris Staley
b4e674aeb0 fix(gemini): no registry fallback — show 0 models when no API keys exist
Removed hardcoded registry fallback for Gemini in dashboard, catalog,
and v1beta endpoints. Without synced models (no API keys), Gemini shows
nothing. Hardcoded entries are always removed from v1beta regardless
of sync result.
2026-04-02 12:12:57 -06:00
Chris Staley
8ed091703f feat(gemini): per-connection model tracking with cleanup on key delete
Store synced models keyed by providerId:connectionId so each API key's
models are tracked separately. On read, union across all connections.
On connection delete, remove only that key's models. Models with no
remaining connections are automatically excluded.
2026-04-02 12:00:59 -06:00
Chris Staley
464fd6d4d3 fix(v1beta): remove Gemini duplicates — filter non-consecutive entries, skip custom models 2026-04-02 11:47:41 -06:00
Chris Staley
5b140d26c3 feat(api): catalog and v1beta read from synced Gemini models 2026-04-02 11:42:46 -06:00
Chris Staley
125fb81fa3 feat(dashboard): Gemini Available Models reads from API sync, hide Custom Models 2026-04-02 11:41:28 -06:00
Chris Staley
5c27e0f9ef feat(gemini): auto-trigger model sync when API key is saved 2026-04-02 11:39:29 -06:00
Chris Staley
7607cec7a2 feat(sync): write Gemini models to syncedAvailableModels with union logic 2026-04-02 11:38:38 -06:00
Chris Staley
faae82eae1 feat(v1beta): use stored token limits and metadata in Gemini models endpoint 2026-04-02 10:18:26 -06:00
Chris Staley
49ac0cadfb feat(catalog): use stored inputTokenLimit for custom model context_length 2026-04-02 10:17:14 -06:00
Chris Staley
325d048340 feat(sync): carry Gemini metadata through model sync 2026-04-02 10:14:17 -06:00
Chris Staley
f1805c8536 feat(gemini): extract metadata from models API response 2026-04-02 10:13:11 -06:00
diegosouzapw
8c58f7a04e test(ci): fix t06 validation error by adding Zod validation to memory/skills routes and allow security audit failure 2026-04-02 09:26:09 -03:00
Diego Rodrigues de Sa e Souza
e121fec599 Merge pull request #905 from rdself/coder/sqlite-wal-checkpoint-shutdown
Flush SQLite WAL on graceful shutdown
2026-04-02 01:00:50 -03:00
R.D.
33297e0226 fix: repair cc compatible v1 route handling 2026-04-01 22:48:34 -03:00
R.D.
a07e643020 fix(model-sync): store real provider in log summary 2026-04-01 22:48:34 -03:00
R.D.
69bbc0a2a1 flush sqlite wal on graceful shutdown 2026-04-01 20:14:31 -04:00
diegosouzapw
d10e70a77b Merge PR #899: fix(model-sync) into release/v3.4.2 2026-04-01 19:28:59 -03:00
diegosouzapw
485eb60dde Merge Pull Request #888 2026-04-01 18:05:45 -03:00
diegosouzapw
7e5e029559 Merge Pull Request #891
# Conflicts:
#	open-sse/handlers/chatCore.ts
2026-04-01 18:05:44 -03:00
tombii
557509ef84 fix(model-sync): skip replace when auto-sync returns empty model list
Prevent auto-sync from wiping manually-imported models when the upstream
/models endpoint fails, times out, or returns an empty list. Added
`allowEmpty` option (default false) to replaceCustomModels — callers that
intentionally clear all models (DELETE ?all=true) pass `allowEmpty: true`.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 23:01:30 +02:00
diegosouzapw
fb3ba8bf92 chore: resolve merge conflicts with feature-antigravity 2026-04-01 08:47:05 -03:00
diegosouzapw
667bda6afb feat: complete memory and skills implementation for antigravity 2026-04-01 08:42:03 -03:00
R.D.
32dc3b36ab chore: rename CC compatible feature flag 2026-04-01 04:39:29 -04:00
R.D.
190f02a939 feat: add hidden Claude Code compatible provider 2026-04-01 04:35:16 -04:00
R.D.
aa2027f1b5 fix provider limits sync cadence 2026-04-01 02:24:53 -04:00
diegosouzapw
f665da9348 chore(release): prepare v3.4.2 integration branch 2026-04-01 02:51:49 -03:00
diegosouzapw
f4fc0e17da Merge branch 'feat/memory-skill-injection-v2' into release/v3.4.2
# Conflicts:
#	src/app/(dashboard)/dashboard/settings/page.tsx
2026-04-01 02:20:40 -03:00
diegosouzapw
b5389cadc8 Merge PR #885 antigravity-audit into release/v3.4.2
# Conflicts:
#	open-sse/executors/antigravity.ts
2026-04-01 02:19:56 -03:00
diegosouzapw
fe77e05aff Merge PR #880 coder/log-rotation-clean-followup into release/v3.4.2 2026-04-01 02:18:38 -03:00
diegosouzapw
906ad8c7c1 Merge PR #881 feat/cache-page-dynamic-v2 into release/v3.4.2 2026-04-01 02:18:34 -03:00
Chris Staley
ff158282e7 fix: remove non-functional Antigravity image models from imageRegistry
The models gemini-2.5-flash-preview-image-generation and
gemini-3.1-flash-image-preview were surfacing in the model catalog
via getAllImageModels() from imageRegistry.ts, not from the live
upstream API. Removed them from the image provider registry.
2026-03-31 23:13:56 -06:00
Chris Staley
5df8abcddf fix: cap gemini-3.1-pro maxOutputTokens and filter live models
- Reduce maxOutputTokens from 131072 to 65535 for gemini-3.1-pro-high
  and gemini-3.1-pro-low, fixing 400 "invalid argument" errors from
  Open WebUI when no max_tokens is specified (upstream limit is 65535)
- Filter non-viable models (gemini-3.1-flash-image-preview,
  gemini-2.5-flash-preview-image-generation, gemini-3-pro-high/low)
  from the live upstream API response in /api/providers/[id]/models
2026-03-31 23:10:57 -06:00
Chris Staley
3fad8479ca fix: remove non-viable Antigravity models from registry and quota display
Models removed from available list (not usable via chat completions):
- gemini-3-pro-high/low — returns empty responses, quota unusable
- gemini-2.5-flash/flash-lite — quota always exhausted on free tier
- gemini-3.1-flash-image-preview — preview variant, not functional

Models hidden from quota UI (in addition to above):
- gemini-3-flash-agent — internal agent model
- gemini-3.1-flash-lite — not usable for chat

Kept gemini-3.1-flash-image in available models (confirmed working).
Removed dead gemini-3-pro from bare Pro ID normalization.
2026-03-31 22:47:40 -06:00
diegosouzapw
60968a926f fix: implement missing memory and skills api routes, wire MCP tools, fix migration numbers 2026-04-01 00:34:06 -03:00
diegosouzapw
93001377bf fix: enforce strict SSRF IP range filtering and block loopback ::1 2026-04-01 00:24:21 -03:00
Chris Staley
adb8127a30 fix: Antigravity model access — registry, 404 lockout, and non-streaming requests
- Update model list to match CLIProxyAPI filtered models (remove stale
  gemini-2.5-pro, claude-sonnet-4-5, claude-sonnet-4, gemini-2.0-flash;
  sort alphabetically)
- Extend 404 model-only lockout to passthrough providers so one missing
  model doesn't lock out the entire Antigravity connection
- Always use streaming upstream endpoint (generateContent causes upstream
  400 for some models that internally convert to OpenAI format with
  stream_options); collect SSE into JSON for non-streaming clients
- Fix unlimited quota models showing 0% by checking q.unlimited before
  recalculating percentage
2026-03-31 20:09:38 -06:00
oyi77
3f7765fdc8 feat(cache): implement dynamic cache components with TDD
- Add MemoryCards, CachePerformance, CacheTrends, IdempotencyLayer components
- Add loading states, error handling, empty state messages
- Add auth guard to /api/cache/stats endpoint (returns 401 unauthenticated)
- Add idempotencyWindowMs to settings (configurable via UI)
- Update getIdempotencyStats() to read window from settings
- Add vitest config for component testing
- Add TDD tests for all 4 components (30 tests passing)

Wave 1-3 complete. Tests pass, build passes.
2026-04-01 08:45:39 +07:00
R.D.
e00a95bf02 Refine pipeline logging and add retention caps 2026-03-31 20:53:25 -04:00
Chris Staley
fbd30dc4ee fix: update Antigravity model list and replace ag/ prefix with antigravity/
- Replace stale model IDs (gemini-3.1-pro-preview, gemini-3.1-flash-lite-preview)
  with correct High/Low tier variants from fetchAvailableModels API
  (gemini-3-pro-high, gemini-3-pro-low, gemini-3.1-pro-high, gemini-3.1-pro-low, etc.)
- Remove ag/ alias prefix in favor of antigravity/ across registry, providers,
  model capabilities, combos, docs, and static model providers
- Make provider alias optional in Zod schema and guard ALIAS_TO_ID/ID_TO_ALIAS maps
- Show raw model IDs in quota display instead of unmapped display names
- Update T28 model catalog test to assert new High/Low tier models
2026-03-31 16:52:29 -06:00
oyi77
fe2aaa81ca fix: address code review issues
- Add file type validation for logo/favicon uploads
- Add error state handling instead of alert()
- Style file inputs with proper button appearance
- Add SSRF protection to favicon API (URL validation)
- Add fetch timeout (5 seconds)
- Add content-type validation
- Reduce cache duration to 5 minutes
- Validate image data size before serving
2026-04-01 05:09:09 +07:00
oyi77
1d47cadae8 feat(favicon): add custom favicon support
- Add customFaviconUrl and customFaviconBase64 to Zod schema
- Add favicon customization UI (URL input + file upload)
- Create /api/settings/favicon endpoint for dynamic favicon
- Update layout.tsx to use generateMetadata for dynamic favicon
- Add i18n keys for favicon customization
- Favicon updates browser tab icon in real-time
2026-04-01 03:54:02 +07:00
Diego Rodrigues de Sa e Souza
70a4d38d04 Release v3.4.0 (Integration) (#861)
* test(settings): add unit tests for debugMode and hiddenSidebarItems

Tests cover:
- PATCH debugMode=true/false
- PATCH hiddenSidebarItems with array values
- Combined updates with both fields

* test(e2e): add Playwright tests for settings toggles

Tests cover:
- Debug mode toggle on/off
- Sidebar visibility toggle
- Settings persistence after page reload

* fix(tests): address code review issues

- Unit tests: fix async/await for getSettings, use direct db functions
- E2E tests: remove conditional logic, use Playwright auto-waiting assertions

* feat(logging): unify request log retention and artifacts

* docs: add dashboard settings toggles to CONTRIBUTING

Add section documenting:
- Debug Mode toggle (Settings → Advanced)
- Sidebar Visibility toggle (Settings → General)

* fix(cache): only inject prompt_cache_key for supported providers

Only inject prompt_cache_key for providers that support prompt caching
(Claude, Anthropic, ZAI, Qwen, DeepSeek). This fixes issue #848 where
NVIDIA API rejected the parameter.

* fix(model-sync): log only channel-level model changes

* feat(providers): add 4 free models to opencode-zen

* feat(providers): add explicit contextLength for opencode-zen free models

* feat(providers): add contextLength for all opencode-zen models

* feat: Improve the Chinese translation

* fix: preserve client cache_control for all Claude-protocol providers

Previously, the cache control preservation logic only recognized a
hardcoded list of providers (claude, anthropic, zai, qwen, deepseek).
This caused OmniRoute to inject its own cache_control markers for
Claude-protocol providers not in that list (bailian-coding-plan, glm,
minimax, minimax-cn, etc.), overwriting the client's cache markers.

The fix checks both:
1. Known caching providers list (existing behavior)
2. Whether targetFormat === 'claude' (all Claude-protocol providers)

This ensures all Claude-compatible providers properly preserve client
cache_control headers when appropriate (Claude Code client, deterministic
routing, etc.).

Also removes unused CacheStatsCard from settings/components (duplicate
of the one in cache/ page).

Fixes cache token calculation for GLM, Minimax, and other Claude-compatible providers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: pure passthrough for Claude→Claude when cache_control preserved

The Claude passthrough path round-trips through OpenAI format
(claude→openai→claude) for structural normalization. This strips
cache_control markers from every content block since OpenAI format
has no equivalent, causing ~42k cache creation tokens per request
with zero cache reads.

When preserveCacheControl is true (Claude Code client, "always"
setting, or deterministic combo), skip the round-trip entirely and
forward the body as-is. Claude Code sends well-formed Messages API
payloads — the normalization was only needed for non-Code clients.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: restore CacheStatsCard — was not a duplicate

The first commit incorrectly deleted CacheStatsCard from
settings/components/ as a "duplicate". It's the only copy — both
settings/page.tsx and cache/page.tsx import from this location.

Restored the i18n-ized version from main.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(429): parse long quota reset times from error body

- Parse XhYmZs format from antigravity error messages (e.g., 27h41m36s)
- Dynamic retry-after threshold (60s default) instead of hardcoded 10s
- Add parseRetryFromErrorText() in accountFallback.ts for body parsing
- Fix 403 'verify your account' to trigger permanent deactivation
- Add keyword matching for 'quota will reset', 'exhausted capacity'
- Add unit tests for retry parsing and keyword matching

Fixes #858 (Antigravity 429 handling)
Fixes #832 (Qwen quota 429 - same underlying bug)

* chore: bump version to v3.4.0-dev

* fix(migrations): rename 013 to 014 to avoid collision with v3.3.11

* chore(docs): update CHANGELOG for v3.4.0 integrations

* fix: Claude token refresh, Antigravity quota, and 429 rate-limit handling

- Fix Claude OAuth token refresh to use form-urlencoded format (standard OAuth2)
- Add anthropic-beta header required by Claude OAuth API
- Switch Antigravity quota to use retrieveUserQuota API (same as Gemini CLI)
- Parse quota reset time for all providers (not just Antigravity)
- Add quota reset keywords to error classifier
- Cap maximum retry time at 24 hours to prevent infinite wait

Closes #836, #857, #858, #832

* fix(dashboard): resolve /dashboard/limits hanging UI with 70+ accounts via chunk parallelization (#784)

---------

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
Co-authored-by: R.D. <rogerproself@gmail.com>
Co-authored-by: kang-heewon <heewon.dev@gmail.com>
Co-authored-by: gmw <rorschach1167@qq.com>
Co-authored-by: tombii <github@tombii.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
2026-03-31 10:22:52 -03:00
Owen
9227964cb6 feat(analytics): add subscription utilization analytics (#847)
- Add quota_snapshots table for time-series quota tracking
- Add QuotaSnapshot DB module with CRUD + cleanup (6h gate)
- Add snapshot save hook in quotaCache.setQuotaCache()
- Add Provider Utilization API: GET /api/usage/utilization
- Add Combo Health API: GET /api/usage/combo-health
- Add ProviderUtilizationTab with recharts LineChart
- Add ComboHealthTab with quota/skew/performance metrics
- Add TimeRangeSelector component (1h/24h/7d/30d)
- Integrate tabs into /dashboard/analytics
- Add unit tests for quotaSnapshots module
- Add E2E tests for analytics tabs
- Add i18n keys for 33 languages
2026-03-31 00:12:27 -03:00
diegosouzapw
23e47a74ee Merge remote main 2026-03-30 20:48:25 -03:00
Diego Rodrigues de Sa e Souza
fce7f6ce47 Merge pull request #830 from rdself/coder/fix-openrouter-available-models
fix: align OpenRouter auto-sync with available models
2026-03-30 20:47:59 -03:00
diegosouzapw
bcb87f5d55 feat: Return only accessible models from /models for restricted API keys (#781) 2026-03-30 20:31:32 -03:00
oyi77
5437d691b5 fix(cache): address code review issues
- Add authentication to /api/cache/entries (GET and DELETE)
- Add authentication to /api/cache (GET and DELETE)
- Validate trendHours: clamp to 1-720 range
- Fix estimatedCostSaved bug: use calculated value instead of hardcoded 0
2026-03-31 04:50:50 +07:00
diegosouzapw
76e135077b Resolve merge conflicts with main natively built Prompt Cache UI 2026-03-30 18:20:19 -03:00
Diego Rodrigues de Sa e Souza
3482dade71 Merge pull request #828 from rdself/coder/fix-combo-test-false-negative
Fix combo test false negatives and parallelize model probes
2026-03-30 18:18:00 -03:00