1. 09 Aug, 2025 13 commits
    • feat: optimized JSONEditor in duplicate key handling · a08e027b
      Merge pull request #1534 from HynoR/feat/je
      同語 committed
    • 🐛 fix(db): allow re-adding models/vendors after soft delete via composite unique indexes · e1796b92
      Ensure models and vendors can be re-created after soft deletion by switching to composite unique indexes on (name, deleted_at) and cleaning up legacy single-column unique indexes on MySQL.
      
      Why
      - MySQL raised 1062 duplicate key errors when re-adding a soft-deleted model/vendor because the legacy unique index enforced uniqueness on the name column alone (uk_model_name / uk_vendor_name), despite soft deletes.
      - Users encountered errors such as:
        - Error 1062 (23000): Duplicate entry 'deepseek-chat' for key 'models.uk_model_name'
        - Error 1062 (23000): Duplicate entry 'DeepSeek' for key 'vendors.uk_vendor_name'
      
      How
      - Model indices:
        - model/model_meta.go:
          - Model.ModelName → gorm: uniqueIndex:uk_model_name,priority:1
          - Model.DeletedAt → gorm: index; uniqueIndex:uk_model_name,priority:2
      - Vendor indices:
        - model/vendor_meta.go:
          - Vendor.Name → gorm: uniqueIndex:uk_vendor_name,priority:1
          - Vendor.DeletedAt → gorm: index; uniqueIndex:uk_vendor_name,priority:2
      - Migration (automatic, idempotent):
        - model/main.go (migrateDB, migrateDBFast):
          - On MySQL, drop legacy single-column unique indexes if present:
            - ALTER TABLE models DROP INDEX uk_model_name;
            - ALTER TABLE vendors DROP INDEX uk_vendor_name;
          - Then run AutoMigrate to create composite unique indexes.
        - Missing-index errors are ignored to keep the migration safe to run multiple times.
      
      Result
      - Users can delete and re-add the same model/vendor name without manual SQL.
      - Migration runs automatically at startup; no user action required.
      - PostgreSQL and SQLite remain unaffected.
      
      Files changed
      - model/model_meta.go
      - model/vendor_meta.go
      - model/main.go (migrateDB, migrateDBFast)
      
      Testing
      - Create model "deepseek-chat" → delete (soft) → re-create → succeeds.
      - Create vendor "DeepSeek" → delete (soft) → re-create → succeeds.
      
      Backward compatibility
      - Data remains intact; only index definitions are updated.
      - Behavior is unchanged except for fixing the uniqueness constraint with soft deletes.
      t0ng7u committed
    • Merge pull request #1500 from antecanis8/gemini_batchembedcontents · 2c4dc446
      fix: Gemini embedding model only embeds the first text in a batch
      Calcium-Ion committed
    • Merge pull request #1429 from feitianbubu/pr/video-preview-modal · 7d08e133
      feat: add video preview modal
      Calcium-Ion committed
    • Merge pull request #1458 from simplty/fix/midjourney-field-compatibility · 9d6c1546
      fix(midjourney): 为 Midjourney 任务添加视频 URL 字段
      Calcium-Ion committed
    • Merge pull request #1465 from fangzhengjin/alpha · 807ec200
      fix: 当OIDC的AuthUrl带有param时,跳转参数拼接错误
      Calcium-Ion committed
    • Merge pull request #1536 from Yincmewy/alpha · 91895f4d
      feats:replace GLM-4v authentication headers to support customize api key
      Calcium-Ion committed
    • 📱 feat(ui): enhance mobile pagination in PricingCardView · 8d7ef18f
      * Integrate `useIsMobile` hook to detect mobile devices.
      * Pagination now automatically:
        * sets `size="small"` on mobile screens
        * enables `showQuickJumper` for quicker navigation on small screens
      * Desktop behaviour remains unchanged.
      t0ng7u committed
    • feat: Extend endpoint templates to cover all native endpoints · 81a24e9a
      This commit updates the quick-fill endpoint templates used in the model and pre-fill group editors:
      
      • `EditModelModal.jsx`
      • `EditPrefillGroupModal.jsx`
      
      Key changes
      1. Added missing default endpoints defined in `common/endpoint_defaults.go`.
         - `openai-response`
         - `gemini`
         - `jina-rerank`
      2. Ensured each template entry includes both `path` and `method` for clarity.
      
      Benefits
      • Provides one-click access to every built-in upstream endpoint, reducing manual input.
      • Keeps the UI definitions in sync with backend defaults, preventing mismatch errors.
      t0ng7u committed
    • 🔧 fix(pricing): synchronize group ratio in Table & Card views with sidebar selection · 13da9eb2
      Problem
      Choosing a different token-group in the pricing sidebar only updated the filter but did **not** refresh the displayed group ratio in both the Table (`@table/`) and Card (`@card/`) views. The callback used by the sidebar changed `filterGroup` yet left `selectedGroup` untouched, so ratio columns/cards kept showing the previous value.
      
      Solution
      • `PricingSidebar.jsx`
        – Accept new prop `handleGroupClick` (from `useModelPricingData`).
        – Forward this callback to `PricingGroups` (`setFilterGroup={handleGroupClick}`) while retaining `setFilterGroup` for reset logic.
        – Keeps both `filterGroup` filtering and `selectedGroup` state in sync via the single unified handler.
      
      Result
      Switching groups in the sidebar now simultaneously updates:
      1. the model list filtering, and
      2. the ratio information shown in both pricing Table and Card views.
      
      No UI/UX regression; linter passes.
      t0ng7u committed
    • 🎨 chore(sidebar): swap “Channel Management” and “Model Management” positions in admin menu · 53ac48ae
      The sidebar’s admin section now displays “Channel Management” before “Model Management” to better reflect common user workflows and improve navigation clarity.
      
      Details:
      • Updated `web/src/components/layout/SiderBar.js`
        – Re-ordered items in `adminItems` array so `channel` precedes `models`.
      • No logic or route changes; this is purely a UI ordering adjustment.
      
      This change enhances usability for administrators by presenting frequently accessed channel settings first.
      t0ng7u committed
  2. 08 Aug, 2025 19 commits
  3. 07 Aug, 2025 8 commits
    • feat(web): add model prefill group quick-add buttons to channel models selector · 85032b3e
      - Added support to fetch and render “model prefill groups” in `EditChannelModal.jsx`
      - Users can now click a group button to instantly merge that group’s models into the models Select
      - Mirrors the prefill-group UX used for tags/endpoints in `EditModelModal.jsx`
      
      Details
      - UI/UX:
        - Renders one button per model group inside the models field’s extra actions
        - Clicking a button merges its items into the selected models (trimmed, deduplicated), updating immediately
        - Non-destructive and works alongside existing actions (fill related/all models, fetch upstream, clear, copy)
      - API:
        - GET `/api/prefill_group?type=model`
        - Handles `items` as either an array or a JSON string array for robustness
        - If request fails or returns no groups, buttons are simply not shown
      - i18n:
        - Reuses existing i18n; group names come from backend and are displayed as-is
      - Performance:
        - Simple set merge; negligible overhead
      - Backward compatibility:
        - No changes required on the backend or elsewhere; feature is additive
      - Testing (manual):
        1) Open channel modal (new or edit) and navigate to the Models section
        2) Confirm model group buttons render when groups are configured
        3) Click a group button → models Select updates with merged models (no duplicates)
        4) Verify other actions (fill related/all, fetch upstream, clear, copy) still work
        5) Close/reopen modal → state resets as expected
      
      Implementation
      - `web/src/components/table/channels/modals/EditChannelModal.jsx`
        - Added `modelGroups` state and `fetchModelGroups()` (GET `/api/prefill_group?type=model`)
        - Invoked `fetchModelGroups()` when the modal opens
        - Rendered group buttons in the models Select `extraText`, merging group items into current selection
      
      Chore
      - Verified no new linter errors were introduced.
      t0ng7u committed
    • 💄 ui: adjust column layout in pricing table · f080bef7
      - Move model price column to fixed right position
      - Convert endpoint types column from fixed to regular column
      - Reorder columns: endpoint types now appears before ratio column
      - Improve table layout and user experience for pricing data viewing
      
      Changes made to web/src/components/table/model-pricing/view/table/PricingTableColumns.js:
      * Removed `fixed: 'right'` from endpointColumn
      * Added `fixed: 'right'` to priceColumn
      * Updated column order in the columns array
      t0ng7u committed
    • 🤓feat: the model management module · dfcee356
      Merge pull request #1452 from QuantumNous/refactor/model-pricing
      同語 committed
    • 🐛 fix(model, web): robust JSON handling; remove datatypes dep; stabilize JSONEditor manual mode · 70719d4a
      - Why:
        - Eliminate `gorm.io/datatypes` for a single field and fix scan errors when drivers return JSON as string.
        - Prevent JSONEditor manual mode from locking on invalid JSON and from appending stray characters after “Fill Template”.
      
      - What:
        - Backend (`model/prefill_group.go`):
          - Replaced `datatypes.JSON` with `JSONValue` (based on `json.RawMessage`) for `PrefillGroup.Items`.
          - Implemented `sql.Scanner` and `driver.Valuer` to accept both `[]byte` and `string`.
          - Implemented `MarshalJSON`/`UnmarshalJSON` to preserve raw JSON in API without base64.
          - Converted comments to Chinese.
        - Frontend (`web/src/components/common/ui/JSONEditor.js`):
          - Added `manualText` buffer for manual mode to avoid input being overridden by external value.
          - Only propagate `onChange` when manual text is valid JSON; otherwise show error but do not block typing.
          - Safe manual-mode rendering: derive rows from `manualText` and avoid calling `split` on non-strings.
          - Improved mode toggle: populate `manualText` from visual data; validate before switching back to visual.
          - Fixed “Fill Template” to sync `manualText`, `jsonData`, and `onChange` to avoid stray trailing characters.
      
      - Impact:
        - Resolves: “unsupported Scan, storing driver.Value type string into type *json.RawMessage”.
        - Resolves: `value.split is not a function` in manual mode.
        - Resolves: extra `s` appended after inserting template.
        - API shape and DB column type remain the same (`gorm:"type:json"`); no `go.mod` changes.
        - Lints pass for modified files.
      
      Files changed:
      - model/prefill_group.go
      - web/src/components/common/ui/JSONEditor.js
      t0ng7u committed
    • ️ refactor(model): replace gorm.io/datatypes with JSONValue for… · 2da0e1a5
      ️ refactor(model): replace gorm.io/datatypes with JSONValue for PrefillGroup.Items; fix JSON scan across drivers
      
      - Why:
        - Avoid introducing `gorm.io/datatypes` for a single field.
        - Align with existing pattern (`ChannelInfo`, `Properties`) using `Scanner`/`Valuer`.
        - Fix runtime error when drivers return JSON as string.
      
      - What:
        - Introduced `JSONValue` (based on `json.RawMessage`) implementing `sql.Scanner` and `driver.Valuer`, with `MarshalJSON`/`UnmarshalJSON` to preserve raw JSON in API.
        - Updated `PrefillGroup.Items` to use `JSONValue` with `gorm:"type:json"`.
        - Localized comments in `model/prefill_group.go` to Chinese.
      
      - Impact:
        - Resolves “unsupported Scan, storing driver.Value type string into type *json.RawMessage”.
        - Works with MySQL/Postgres/SQLite whether JSON is returned as `[]byte` or `string`.
        - API and DB schema remain unchanged; no `go.mod` changes; lints pass.
      
      Files changed:
      - model/prefill_group.go
      t0ng7u committed
    • ️ refactor(model): replace gorm.io/datatypes with json.RawMessage for PrefillGroup.Items · 3fc7f7e8
      - Why: Avoid adding `gorm.io/datatypes` for a single field; the rest of the codebase does not use it, and using the standard library keeps dependencies lean.
      - What:
        - Switched `PrefillGroup.Items` from `datatypes.JSON` to `json.RawMessage`.
        - Updated imports in `model/prefill_group.go` to use `encoding/json` and removed the unused `gorm.io/datatypes`.
        - Preserved `gorm:"type:json"` so DB column behavior remains the same.
      - Impact:
        - API response/request shape for `items` remains unchanged (still JSON).
        - DB schema behavior is unchanged; GORM migration continues to handle the field as JSON.
        - No other references to `datatypes` exist; no `go.mod` changes needed.
        - Lints pass for the modified file.
      
      Files changed:
      - model/prefill_group.go
      
      No breaking changes.
      t0ng7u committed