1. 10 Sep, 2025 2 commits
  2. 08 Sep, 2025 1 commit
  3. 07 Sep, 2025 4 commits
  4. 06 Sep, 2025 2 commits
    • 🐛 fix(models): export setActivePage to prevent tab-change TypeError · baf134cd
      Context:
      Clicking a vendor tab triggered “setActivePage is not a function” from ModelsTabs.jsx:43.
      
      Root cause:
      ModelsTabs expects `setActivePage` via props (spread from `useModelsData`), but the hook did not expose it in its return object, so the prop resolved to `undefined`.
      
      Fix:
      Export `setActivePage` from `useModelsData`’s return object so `ModelsTabs` receives a valid function.
      
      Result:
      Tab switching now correctly resets pagination to page 1 and reloads models without runtime errors.
      
      Files:
      - web/src/hooks/models/useModelsData.jsx
      
      Test plan:
      - Open the Models page
      - Click different vendor tabs
      - Verify no crash occurs and the list reloads with page reset to 1
      
      Refs: web/src/components/table/models/ModelsTabs.jsx:43
      t0ng7u committed
  5. 05 Sep, 2025 1 commit
  6. 04 Sep, 2025 2 commits
  7. 03 Sep, 2025 4 commits
  8. 02 Sep, 2025 12 commits
    • 🐛 fix(models-sync): allow sync when no conflicts selected · 22b724ca
      When syncing official models, clicking "Apply overwrite" with zero selected
      conflict fields resulted in no request being sent and the modal simply closing.
      This blocked creation of missing models/vendors even though the backend
      supports an empty `overwrite` array and will still create missing items.
      
      Changes:
      - Remove the early-return guard in `UpstreamConflictModal.handleOk`
      - Always call `onSubmit(payload)` even when `payload` is empty
      - Keep closing behavior when the request succeeds
      
      Behavior:
      - Users can now proceed with upstream sync without selecting any conflict fields
      - Missing models/vendors are created as expected
      - Existing models are not overwritten unless fields are explicitly selected
      
      Affected:
      - web/src/components/table/models/modals/UpstreamConflictModal.jsx
      
      Quality:
      - Lint passes
      - No breaking changes
      - No visual/UI changes beyond the intended behavior
      
      Test plan:
      1) Open official models sync and trigger a conflicts preview
      2) Click "Apply overwrite" without selecting any fields
      3) Expect the sync to proceed and a success toast indicating created models
      4) Re-try with some fields selected to confirm overwrites still work
      t0ng7u committed
    • 🐛 fix(models sync): send correct overwrite payload and drop fallback · 25dbd39d
      Ensure UpstreamConflictModal submits { overwrite: payload, locale } instead of spreading an array into an object
      Remove numeric-key fallback from applyUpstreamOverwrite for simpler and explicit logic
      Effect: selected fields are now actually updated; success message shows updated model count
      Refs: backend SyncUpstreamModels expects overwrite: overwriteField[]
      t0ng7u committed
    • feat(sync): multi-language sync wizard, backend locale support, and conflict… · 14af0875
       feat(sync): multi-language sync wizard, backend locale support, and conflict modal UX improvements
      
      Frontend (web)
      - ModelsActions.jsx
        - Replace “Sync Official” with “Sync” and open a new two-step SyncWizard.
        - Pass selected locale through to preview, sync, and overwrite flows.
        - Keep conflict resolution flow; inject locale into overwrite submission.
      
      - New: models/modals/SyncWizardModal.jsx
        - Two-step wizard: (1) method selection (config-sync disabled for now), (2) language selection (en/zh/ja).
        - Horizontal, centered Radio cards; returns { option, locale } via onConfirm.
      
      - UpstreamConflictModal.jsx
        - Add search input (model fuzzy search) and native pagination.
        - Column header checkbox now only applies to rows in the current filtered result.
        - Fix “Cannot access ‘filteredDataSource’ before initialization”.
        - Refactor with useMemo/useCallback; extract helpers to remove duplicated logic:
          - getPresentRowsForField, getHeaderState, applyHeaderChange
        - Minor code cleanups and stability improvements.
      
      - i18n (en.json)
        - Add strings for the sync wizard and related actions (Sync, Sync Wizard, Select method/source/language, etc.).
        - Adjust minor translations.
      
      Hooks
      - useModelsData.jsx
        - Extend previewUpstreamDiff, syncUpstream, applyUpstreamOverwrite to accept options with locale.
        - Send locale via query/body accordingly.
      
      Backend (Go)
      - controller/model_sync.go
        - Accept locale from query/body and resolve i18n upstream URLs.
        - Add SYNC_UPSTREAM_BASE for upstream base override (default: https://basellm.github.io/llm-metadata).
        - Make HTTP timeouts/retries/limits configurable:
          - SYNC_HTTP_TIMEOUT_SECONDS, SYNC_HTTP_RETRY, SYNC_HTTP_MAX_MB
        - Add ETag-based caching and support both envelope and pure array JSON formats.
        - Concurrently fetch vendors and models; improve error responses with locale and source URLs.
        - Include source meta (locale, models_url, vendors_url) in success payloads.
      
      Notes
      - No breaking changes expected.
      - Lint passes for touched files.
      t0ng7u committed
    • Merge pull request #1733 from seefs001/fix/jsoneditor · 40831267
      fix: adjust column spans in JSONEditor for better layout  #1719
      Seefs committed
    • Merge pull request #1724 from momomobinx/base · ada7b968
      openai v1/models 完全兼容 解决接入trae时候的字段校验
      Seefs committed
    • Merge branch 'alpha' into base · 785d0c42
      Seefs committed
    • 🎨 fix: sidebar skeleton background and icon spacing consistency · 42e5794d
      - Set sidebar skeleton background to use theme variable (--semi-color-bg-0) instead of hardcoded white for better dark mode compatibility
      - Apply consistent background to both collapsed and expanded skeleton states
      - Ensure sidebar container uses theme background when skeleton is loading
      - Remove duplicate margin-right classes from skeleton wrapper components that conflicted with CSS definitions
      - Simplify navigation text structure by removing unnecessary div wrappers to improve text truncation
      - Add proper text layout styles for better truncation handling when menu items have long names
      - Standardize icon-to-text spacing across all sidebar navigation items
      t0ng7u committed
  9. 01 Sep, 2025 12 commits
    • 🐛 fix(web/layout): explicitly import headerbar/index.jsx to resolve Linux build failure · c28e89ab
      The Linux/Vite build failed with:
      “Could not resolve "./headerbar" from "src/components/layout/PageLayout.jsx"”
      
      On Linux and with stricter ESM/rollup resolution, directory index files (index.jsx)
      may not be auto-resolved reliably. Explicitly importing the index file ensures
      cross-platform stability.
      
      Changes:
      - Update PageLayout import from "./headerbar" to "./headerbar/index.jsx"
      
      Impact:
      - Fixes build on Linux
      - No runtime behavior changes
      
      Verification:
      - Linter passes for web/src/components/layout/PageLayout.jsx
      
      Notes:
      - Prefer explicit index file imports (and extensions) to avoid platform differences.
      t0ng7u committed
    • feat: Add skeleton loading states for sidebar navigation · d8e36a70
      Add comprehensive skeleton screen implementation for sidebar to improve loading UX, matching the existing headerbar skeleton pattern.
      
      ## Features Added
      - **Sidebar skeleton screens**: Complete 1:1 recreation of sidebar structure during loading
      - **Responsive skeleton layouts**: Different layouts for expanded (164×30px) and collapsed (44×44px) states
      - **Skeleton component enhancements**: Extended SkeletonWrapper with new skeleton types (sidebar, button, sidebarNavItem, sidebarGroupTitle)
      - **Minimum loading time**: Integrated useMinimumLoadingTime hook with 500ms duration for smooth UX
      
      ## Layout Specifications
      - **Expanded nav items**: 164×30px with 8px horizontal margins and 3px vertical margins
      - **Collapsed nav items**: 44×44px with 4px bottom margin and 8px horizontal margins
      - **Collapse button**: 156×24px (expanded) / 36×24px (collapsed) with rounded corners
      - **Container padding**: 12px top padding, 8px horizontal margins
      - **Group labels**: 4px 15px 8px padding matching real sidebar-group-label styles
      
      ## Code Improvements
      - **Refactored skeleton rendering**: Eliminated code duplication using reusable components (NavRow, CollapsedRow)
      - **Configuration-driven sections**: Sections defined as config objects with title widths and item widths
      - **Fixed width calculations**: Removed random width generation, using precise fixed widths per menu item
      - **Proper CSS class alignment**: Uses real sidebar CSS classes (sidebar-section, sidebar-group-label, sidebar-divider)
      
      ## UI/UX Enhancements
      - **Bottom-aligned collapse button**: Fixed positioning using margin-top: auto to stay at viewport bottom
      - **Accurate spacing**: Matches real sidebar margins, padding, and spacing exactly
      - **Skeleton stability**: Fixed width values prevent layout shifts during loading
      - **Clean file structure**: Removed redundant HeaderBar.js export file
      
      ## Technical Details
      - Extended SkeletonWrapper component with sidebar-specific skeleton types
      - Integrated skeleton loading state management in SiderBar component
      - Added support for collapsed state awareness in skeleton rendering
      - Implemented precise dimension matching for pixel-perfect loading states
      
      Closes: Sidebar skeleton loading implementation
      t0ng7u committed
    • 🧹 refactor(db): remove legacy models/vendors index cleanup logic · d15b31ab
      - Delete dropIndexIfExists helper from `model/main.go`
      - Remove all calls to dropIndexIfExists in `migrateDB` and `migrateDBFast`
      - Drop related comments and MySQL-only DROP INDEX code paths
      - Keep GORM AutoMigrate as the sole migration path for `Model` and `Vendor`
      
      Why:
      - Simplifies migrations and avoids destructive index drops at startup
      - Prevents noisy MySQL 1091 errors and vendor-specific branches
      - Aligns with composite unique indexes (uk_model_name_delete_at, uk_vendor_name_delete_at)
      
      Impact:
      - No expected runtime behavior change; schema remains managed by GORM
      - Legacy single-column unique indexes (if any) will no longer be auto-dropped
      - Safe across MySQL/PostgreSQL/SQLite; MySQL Chinese charset checks remain intact
      
      Verification:
      - Lint passed for `model/main.go`
      - Confirmed no remaining `DROP INDEX` or `dropIndexIfExists` references
      t0ng7u committed
    • feat(models-sync): official upstream sync with conflict resolution UI, opt‑out… · 54f118d9
       feat(models-sync): official upstream sync with conflict resolution UI, opt‑out flag, and backend resiliency
      
      Backend
      - Add endpoints:
        - GET /api/models/sync_upstream/preview — diff preview (filters out models with sync_official = 0)
        - POST /api/models/sync_upstream — apply sync (create missing; optionally overwrite selected fields)
      - Respect opt‑out: skip models with sync_official = 0 in both preview and apply
      - Return detailed stats: created_models, created_vendors, updated_models, skipped_models, plus created_list / updated_list
      - Add model.Model.SyncOfficial (default 1); auto‑migrated by GORM
      - Make HTTP fetching robust:
        - Shared http.Client (connection reuse) with 3x exponential backoff retry
        - 10MB response cap; keep existing IPv4‑first for *.github.io
      - Vendor handling:
        - New ensureVendorID helper (cache lookup → DB lookup → create), reduces round‑trips
        - Transactional overwrite to avoid partial updates
      - Small cleanups and clearer helpers (containsField, coalesce, chooseStatus)
      
      Frontend
      - ModelsActions: add “Sync official” button with Popover (p‑2) explaining community contribution; loading = syncing || previewing; preview → conflict modal → apply flow
      - New UpstreamConflictModal:
        - Per‑field columns (description/icon/tags/vendor/name_rule/status) with column‑level checkbox to select all
        - Cell with Checkbox + Tag (“Click to view differences”) and Popover (p‑2) showing Local vs Official values
        - Auto‑hide columns with no conflicts; responsive width; use native Semi Modal footer
        - Full i18n coverage
      - useModelsData: add syncing/previewing states; new methods previewUpstreamDiff, applyUpstreamOverwrite, syncUpstream; refresh vendors/models after apply
      - EditModelModal: add “Participate in official sync” switch; persisted as sync_official
      - ModelsColumnDefs: add “Participate in official sync” column
      
      i18n
      - Add missing English keys for the new UI and messages; fix quoting issues
      
      Refs
      - Upstream metadata: https://github.com/basellm/llm-metadata
      t0ng7u committed
    • feat(ratio-sync, ui): add built‑in “Official Ratio Preset” and harden upstream sync · 55c82713
      Backend (controller/ratio_sync.go):
      - Add built‑in official upstream to GetSyncableChannels (ID: -100, BaseURL: https://basellm.github.io)
      - Support absolute endpoint URLs; otherwise join BaseURL + endpoint (defaults to /api/ratio_config)
      - Harden HTTP client:
        - IPv4‑first with IPv6 fallback for github.io
        - Add ResponseHeaderTimeout
        - 3 attempts with exponential backoff (200/400/800ms)
      - Validate Content-Type and limit response body to 10MB (safe decode via io.LimitReader)
      - Robust parsing: support type1 ratio_config map and type2 pricing list
      - Use net.SplitHostPort for host parsing
      - Use float tolerance in differences comparison to avoid false mismatches
      - Remove unused code (tryDirect) and improve warnings
      
      Frontend:
      - UpstreamRatioSync.jsx: auto-assign official endpoint to /llm-metadata/api/newapi/ratio_config-v1-base.json
      - ChannelSelectorModal.jsx:
        - Pin the official source at the top of the list
        - Show a green “官方” tag next to the status
        - Refactor status renderer to accept the full record
      
      Notes:
      - Backward compatible; no API surface changes
      - Official ratio_config reference: https://basellm.github.io/llm-metadata/api/newapi/ratio_config-v1-base.json
      t0ng7u committed
    • Merge pull request #1680 from HynoR/fix/res · 7d972851
      fix: update model name filtering to be case-sensitive
      Seefs committed
    • Merge pull request #1712 from seefs001/feature/bark · 99afd05d
      feat: bark notification #1699
      Seefs committed
    • Merge pull request #1713 from seefs001/feature/channel_remark · 60b7db29
      feat: add channel remark #1710
      Seefs committed
    • feat: add channel remark #1710 · 06785c01
      Seefs committed