Commit Graph

852 Commits

Author SHA1 Message Date
Diego Rodrigues de Sa e Souza
83c358deb1 Merge pull request #932 from oyi77/feat/lkgp-strategy-919
feat(routing): implement Last Known Good Provider (LKGP) strategy (#919)
2026-04-02 20:46:38 -03:00
Diego Rodrigues de Sa e Souza
7dd214f3db Merge pull request #933 from christopher-s/gemini-google-ai-studio-audit
fix(gemini): API field casing, safety finish reasons, pagination timeout
2026-04-02 20:46:05 -03:00
Chris Staley
75daf98112 fix(gemini): correct API field casing, add safety finish reasons, pagination timeout
Stability fixes for the Gemini provider — no new features:
- Map SAFETY/RECITATION/BLOCKLIST finish reasons (gemini-to-openai → content_filter)
- Add 15s per-page timeout on models sync pagination to prevent indefinite hangs
- Fix mime_type → mimeType in inlineData to match Gemini v1beta API (camelCase)
- Fix include_thoughts → includeThoughts to match Gemini API (camelCase)
- Add inlineData/mime_type fallback in gemini-to-openai request translator
2026-04-02 16:37:58 -06:00
diegosouzapw
9a681a27ad fix(sidebar): remove duplicate memory and skills tabs from primary section 2026-04-02 19:03:24 -03:00
Chris Staley
25c63c8b10 merge: sync with upstream origin/main (v3.4.5+v3.4.6)
Merges upstream changes including: circuit breaker fixes, Claude Code
compatible streaming, CLIProxyAPI routing, GitHub Copilot token refresh,
qoder PAT support, streaming timeouts, OpenAI response sanitization,
memory/skills sidebar, and i18n improvements.

Resolves conflicts in:
- providers/[id]/page.tsx: merged providerSupportsPat + Gemini synced models
- providers/route.ts: kept normalizeQoderPatProviderData, removed auto-sync
  (now handled client-side with progress dialog)
- i18n files: upstream already includes modelsImported/close keys
2026-04-02 15:55:18 -06:00
Chris Staley
a069df41b8 fix: address PR review — timeouts, pagination safety, standardized cooldowns
- Add 30s AbortSignal timeout to sync-models fetch in progress dialog
- Add duplicate nextPageToken detection to prevent infinite pagination
- Standardize retry-after defaults to COOLDOWN_MS.rateLimit (120s)
- Add connection metadata update (lastErrorType/lastError) for
  per-model lockout early return in auth.ts
- Clarify lockModel race safety in single-threaded Node.js
2026-04-02 15:48:36 -06:00
Chris Staley
b1183c2c9d feat(models): add pageSize=1000 and nextPageToken pagination for Gemini
Google AI Studio defaults to 50 models per page. Set pageSize=1000
to maximize per-page results and follow nextPageToken to fetch all
available models across pages. Also fixes query param separator when
base URL already contains query string.
2026-04-02 15:40:05 -06:00
oyi77
b777b15ee8 feat(routing): implement Last Known Good Provider (LKGP) strategy (#919) 2026-04-03 04:31:02 +07:00
Chris Staley
35061dfc53 refactor: consolidate per-model quota logic into shared helpers
Replace inline `provider === "gemini"` checks in chatCore.ts and auth.ts
with shared hasPerModelQuota() and lockModelIfPerModelQuota() from
accountFallback.ts. Also adds max-cooldown preservation to lockModel()
to prevent race conditions from overwriting longer lockouts.
2026-04-02 15:29:01 -06:00
diegosouzapw
72203f2721 feat(i18n): translation strings for memory and skills namespaces 2026-04-02 18:21:49 -03:00
Chris Staley
03ff03ed52 fix(gemini): filter out locked models during credential selection
isModelLocked() was called to lock models on 429 but never checked
when selecting connections. Requests to a locked model would still
route to it, causing unnecessary repeated 429s.
2026-04-02 15:18:36 -06:00
diegosouzapw
488d50b97e Merge remote-tracking branch 'origin/release/v3.4.6' into fix/memory-skills-cache-providers 2026-04-02 18:16:08 -03:00
Diego Rodrigues de Sa e Souza
27fe556bab Merge pull request #930 from tombii/tombii/fix/circuit-breaker-stuck-open
fix(resilience): prevent circuit breaker stuck OPEN in combo path
2026-04-02 18:14:52 -03:00
diegosouzapw
3191b7a991 fix: resolve memory/skills sidebar visibility, deep-read workflow, and Gemini 3 thought_signature bug 2026-04-02 18:14:38 -03:00
Chris Staley
f8d045c275 fix(gemini): per-model quota isolation — 429 on one model keeps others active
Gemini AI Studio enforces per-model quotas. Previously a 429 on
gemini-2.5-pro would mark the entire connection as credits_exhausted,
blocking all models on that API key.

Three-layer fix:
- chatCore: lock model only (not connection) for RATE_LIMITED and
  QUOTA_EXHAUSTED errors from Gemini
- auth: early-return with model-only lockout before terminal status
  check, so credits_exhausted is never set on the connection
- rateLimitManager: use model-scoped limiter keys for Gemini so the
  Bottleneck queue pauses only the affected model, not the connection
- chat: skip markAccountExhaustedFrom429 for Gemini (per-model quotas)
2026-04-02 15:13:46 -06:00
Chris Staley
0038fe5ff1 feat(gemini): per-model quota lockout instead of connection-wide
Gemini AI Studio has per-model quota limits. When one model hits its
quota (429), other models on the same API key may still be available.

- Use lockModel() for 429s on Gemini (model-only lockout, connection
  stays active for other models)
- Skip markAccountExhaustedFrom429 for Gemini (prevents deprioritizing
  the entire connection in credential selection)
- Apply model-only 404 lockout for Gemini too (deprecated/unavailable
  models shouldn't disable the provider)
2026-04-02 14:51:01 -06:00
Chris Staley
3ae810a18e fix(gemini): log sync errors, optimize synced models query
- Replace silent catch blocks with logged errors in catalog and v1beta
- Use SQL LIKE filter instead of fetching all rows and filtering in-memory
2026-04-02 14:42:38 -06:00
tombii
afe72c8029 fix(resilience): reset lastFailureTime on OPEN → CLOSED transition
Match reset() behavior — clear lastFailureTime when recovering from
OPEN state to avoid stale timestamps in persisted state.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 22:42:13 +02:00
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
tombii
c0da968af2 fix(resilience): prevent circuit breaker stuck OPEN in combo path
Combo handlers call _onSuccess()/_onFailure() directly instead of
execute(), bypassing the OPEN→HALF_OPEN→CLOSED transition. After
resetTimeout elapses, canExecute() returns true and requests flow
through, but _onSuccess() only reset failureCount without changing
state — leaving the breaker permanently OPEN with 0 failures.

Handle OPEN state in both methods: _onSuccess() now transitions
OPEN→CLOSED, _onFailure() skips redundant re-transition.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 22:36:57 +02:00
diegosouzapw
d71c4a0ea7 fix(db): correct migration versions sequence (014-017) to resolve UNIQUE constraint failure in CI tests 2026-04-02 17:13:36 -03:00
Chris Staley
7f785b8fa5 fix(gemini): refresh Available Models UI after API key add/delete
Auto-sync is fire-and-forget on the server, so the dashboard needs to
poll for model updates after saving a Gemini key (3s delay). On delete,
refresh models immediately since DB cleanup is synchronous.
2026-04-02 12:44:18 -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
diegosouzapw
ee14372e20 Merge PR #912 (I18N String improvements) 2026-04-02 14:40:01 -03: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
9e4132fd3f feat(db): add syncedAvailableModels namespace and CRUD functions 2026-04-02 11:37:23 -06:00
Diego Rodrigues de Sa e Souza
0ae31e0acc Merge pull request #925 from rdself/coder/fix-cloudflared-restart-warning
fix(cloudflared): avoid stale quick tunnel restart state
2026-04-02 14:37:15 -03:00
Diego Rodrigues de Sa e Souza
2ab41a359e Merge pull request #923 from GGGO076/fix/github-copilot-v2
fix: GitHub Copilot token refresh failure and reasoning field stripping
2026-04-02 14:37:04 -03:00
Diego Rodrigues de Sa e Souza
c87167cac4 Merge pull request #921 from rdself/coder/cc-compatible-streaming-ui
Fix CC compatible streaming and compatible provider UI
2026-04-02 14:36:59 -03:00
Diego Rodrigues de Sa e Souza
46311dfaba Merge pull request #918 from rdself/coder/fix-timeout-env-stream-300s
fix: make request and stream timeouts fully env-configurable
2026-04-02 14:36:53 -03:00
Diego Rodrigues de Sa e Souza
03720bbb81 Merge pull request #917 from tombii/fix/qwen-oauth-token-and-resource-url
fix(oauth): persist providerSpecificData from token refresh in health check
2026-04-02 14:36:48 -03:00
Diego Rodrigues de Sa e Souza
3319fd6a21 Merge pull request #916 from oyi77/feat/cliproxyapi-3-version-manager
feat(cliproxyapi): version manager service, API routes, CLI Tools UI & Docker
2026-04-02 14:36:43 -03:00
Diego Rodrigues de Sa e Souza
9fd5d8241e Merge pull request #914 from oyi77/feat/cliproxyapi-1-schema-settings
feat(cliproxyapi): DB schema, upstream proxy config & settings UI
2026-04-02 14:36:31 -03:00
Diego Rodrigues de Sa e Souza
0bfee823dd Merge pull request #913 from carmin777/feat/qoder-pat-qodercli
feat(qoder): support PAT via qodercli and remove stale qoder.cn defaults
2026-04-02 14:36:25 -03:00
oyi77
d1b8afd3b8 fix(providers): remove non-OpenAI-compatible providers, fix review feedback
Address code review from gemini-code-assist:

- Remove 5 providers with incompatible APIs that would not work through
  OmniRoute's OpenAI-compatible proxy pipeline:
  - Replicate (uses /v1/predictions + version ID format)
  - fal.ai (custom model-specific endpoints)
  - Segmind (model-specific URLs, custom x-api-key auth)
  - Runware (task-based API)
  - WaveSpeed AI (task-based submit/get API)

- Keep 4 verified OpenAI-compatible providers:
  - Novita AI (confirmed OpenAI-compatible APIs)
  - PiAPI (LLM /v1/chat/completions confirmed)
  - GoAPI (explicitly implements OpenAI API spec)
  - LaoZhang AI (OpenAI-compatible proxy)

- Fix hardcoded "Peak cached:" label in CacheTrends → use t("peakCached")
- Add "peakCached" translation key to en.json

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-03 00:11:42 +07:00
oyi77
0f8b9ca55b feat(providers): register image/video/audio providers from community list
Add 9 new API-key providers for image, video, and media generation:
- Replicate (rep/) — ML model marketplace with passthrough models
- fal.ai (fal/) — fast inference for generative media
- Novita AI (novita/) — image/video generation platform
- Segmind (seg/) — image generation models
- Runware (rw/) — real-time image generation
- WaveSpeed AI (ws/) — fast media generation
- PiAPI (pi/) — multi-model API gateway
- GoAPI (ggo/) — aggregated AI API access
- LaoZhang AI (lz/) — multi-provider proxy

These providers support image/video/audio endpoints natively via
OpenAI-compatible format, solving the gap where only chat-focused
providers were registered.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-02 23:50:58 +07:00
oyi77
b5c84a91fb fix(cache): fix trends chart data mismatch and remove redundant metrics card
- Align CacheTrends interface with API response (cachedRequests instead of hits/misses/hitRate)
- Update bar chart rendering to use cachedRequests field from getCacheTrend()
- Remove duplicate CacheStatsCard from cache overview (already in settings AI tab)
- Fix tooltip to use i18n translations instead of hardcoded English

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-02 23:50:48 +07:00
oyi77
cc902db4ab fix(dashboard): add Memory/Skills sidebar navigation and i18n keys
- Add "memory" and "skills" entries to HIDEABLE_SIDEBAR_ITEM_IDS and PRIMARY_SIDEBAR_ITEMS
- Add sidebar translation keys for memory and skills pages
- Add complete "memory" and "skills" i18n sections to en.json with all UI labels
- Replace all hardcoded English text in memory/page.tsx with useTranslations() calls

Memory and Skills pages now appear in the sidebar and render with proper i18n support.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-02 23:44:11 +07: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
bd5f39e1c6 feat(db): extend replaceCustomModels with metadata fields 2026-04-02 10:15:38 -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
R.D.
ed72ddc4d3 fix(cloudflared): avoid stale restart state 2026-04-02 05:40:26 -04:00