Commit Graph

256 Commits

Author SHA1 Message Date
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
R.D.
ff73de5716 fix openrouter available models sync 2026-03-30 17:07:46 -04:00
diegosouzapw
7a37c79ebc ci: fix pipeline errors and enforce route lint validatation 2026-03-30 17:54:44 -03:00
R.D.
ba227c5ec3 Run combo health probes concurrently 2026-03-30 16:49:01 -04:00
oyi77
6780485051 feat(cache): persistent metrics, cache entry browser, settings UI, MCP tools, prefix analyzer
Implements remaining features from #813:

Phase 1 - Persistent Metrics:
- Add cache_metrics table for persistent hit/miss tracking
- Semantic cache stats now survive server restarts

Phase 2 - Cache Entry Browser:
- /api/cache/entries endpoint with search, pagination, delete
- CacheEntriesTab component for browsing cached entries

Phase 3 - Settings UI:
- CacheSettingsTab for semantic/prompt cache configuration
- /api/settings/cache-config endpoint

Phase 4 - Prefix Analyzer:
- src/lib/promptCache/prefixAnalyzer.ts for intelligent caching
- Analyzes message arrays to find stable prefixes

Phase 5 - Provider Support:
- Added deepseek to CACHING_PROVIDERS

Phase 6 - MCP Tools:
- omniroute_cache_stats tool
- omniroute_cache_flush tool

Phase 7 - Retention:
- cleanOldMetrics() for auto-purge of old entries

Closes #813
2026-03-30 17:32:45 -03:00
oyi77
d043e7a242 feat(cache): fix cache page to display prompt cache metrics and trend data
Closes #813
2026-03-30 17:32:45 -03:00
Chris Staley
c5d9b5f51d fix: apply PR review feedback for Gemini CLI quota
- Add early return guard for missing accessToken in getGeminiUsage
- Add 10s fetch timeout (AbortSignal.timeout) on retrieveUserQuota calls
- Clamp used value with Math.max(0, ...) for non-negative display
- Use full accessToken as cache key instead of truncated prefix
- Replace catch(err: any) with instanceof Error check in models route
2026-03-30 17:32:42 -03:00
Chris Staley
35e2892b98 feat: add real Gemini CLI quota tracking via retrieveUserQuota API
Replace stub getGeminiUsage() with per-model quota fetching from Google
Cloud Code Assist's retrieveUserQuota endpoint (same API the official
Gemini CLI /stats command uses). Fixes OAuth env var name, aligns model
list with official Gemini CLI VALID_GEMINI_MODELS, and makes "Import
from /models" discover new models via the quota endpoint.
2026-03-30 17:32:42 -03:00