1. 07 Aug, 2025 3 commits
    • feat(pricing+endpoints+ui): wire custom endpoint mapping end‑to‑end and… · 5b268d85
       feat(pricing+endpoints+ui): wire custom endpoint mapping end‑to‑end and overhaul visual JSON editor
      
      Backend (Go)
      - Include custom endpoints in each model’s SupportedEndpointTypes by parsing Model.Endpoints (JSON) and appending keys alongside native endpoint types.
      - Build a global supportedEndpointMap map[string]EndpointInfo{path, method} by:
        - Seeding with native defaults.
        - Overriding/adding from models.endpoints (accepts string path → default POST, or {path, method}).
      - Expose supported_endpoint at the top level of /api/pricing (vendors-like), removing per-model duplication.
      - Fix default path for EndpointTypeOpenAIResponse to /v1/responses.
      - Keep concurrency/caching for pricing retrieval intact.
      
      Frontend (React)
      - Fetch supported_endpoint in useModelPricingData and propagate to PricingPage → ModelDetailSideSheet → ModelEndpoints.
      - ModelEndpoints
        - Resolve path+method via endpointMap; replace {model} with actual model name.
        - Fix mobile visibility; always show path and HTTP method.
      - JSONEditor
        - Wrap with Form.Slot to inherit form layout; simplify visual styles.
        - Use Tabs for “Visual” / “Manual” modes.
        - Unify editors: key-value editor now supports nested JSON:
          - “+” to convert a primitive into an object and add nested fields.
          - Add “Convert to value” for two‑way toggle back from object.
          - Stable key rename without reordering rows; new rows append at bottom.
          - Use Row/Col grid for clean alignment; region editor uses Form.Slot + grid.
      - Editing flows
        - EditModelModal / EditPrefillGroupModal use JSONEditor (editorType='object') for endpoint mappings.
        - PrefillGroupManagement renders endpoint group items by JSON keys.
      
      Data expectations / compatibility
      - models.endpoints should be a JSON object mapping endpoint type → string path or {path, method}. Strings default to POST.
      - No schema changes; existing TEXT field continues to store JSON.
      
      QA
      - /api/pricing now returns custom endpoint types and global supported_endpoint.
      - UI shows both native and custom endpoints; paths/methods render on mobile; nested editing works and preserves order.
      t0ng7u committed
    • 🎨 feat(models): add row styling for disabled models in ModelsTable · 1d28e4dd
      Add visual distinction for enabled/disabled models by applying different
      background colors to table rows based on model status. This implementation
      follows the same pattern used in ChannelsTable for consistent user experience.
      
      Changes:
      - Modified handleRow function in useModelsData.js to include row styling
      - Disabled models (status !== 1) now display with gray background using
        --semi-color-disabled-border CSS variable
      - Enabled models (status === 1) maintain normal background color
      - Preserved existing row click selection functionality
      
      This enhancement improves the visual feedback for users to quickly identify
      which models are active vs inactive in the models management interface.
      t0ng7u committed
  2. 06 Aug, 2025 9 commits
  3. 05 Aug, 2025 12 commits
    • feat(models): Revamp EditModelModal UI and UX · 029768e8
      This commit significantly refactors the `EditModelModal` component to streamline the user interface and enhance usability, aligning it with the interaction patterns found elsewhere in the application.
      
      - **Consolidated Layout:** Merged the "Vendor Information" and "Feature Configuration" sections into a single "Basic Information" card. This simplifies the form, reduces clutter, and makes all settings accessible in one view.
      
      - **Improved Prefill Groups:** Replaced the separate `Select` dropdowns for tag and endpoint groups with a more intuitive button-based system within the `extraText` of the `TagInput` components.
      
      - **Additive Button Logic:** The prefill group buttons now operate in an additive mode. Users can click multiple group buttons to incrementally add tags or endpoints, with duplicates being automatically handled.
      
      - **Clear Functionality:** Added "Clear" buttons for both tags and endpoints, allowing users to easily reset the fields.
      
      - **Code Cleanup:** Removed the unused `endpointOptions` constant and unnecessary icon imports (`Building`, `Settings`) to keep the codebase clean.
      t0ng7u committed
    • 🚀 refactor: migrate vendor-count aggregation to model layer & align frontend logic · ac054461
      Summary
      • Backend
        – Moved duplicate-name validation and total vendor-count aggregation from controllers (`controller/model_meta.go`, `controller/vendor_meta.go`, `controller/prefill_group.go`) to model layer (`model/model_meta.go`, `model/vendor_meta.go`, `model/prefill_group.go`).
        – Added `GetVendorModelCounts()` and `Is*NameDuplicated()` helpers; controllers now call these instead of duplicating queries.
        – API response for `/api/models` now returns `vendor_counts` with per-vendor totals across all pages, plus `all` summary.
        – Removed redundant checks and unused imports, eliminating `go vet` warnings.
      
      • Frontend
        – `useModelsData.js` updated to consume backend-supplied `vendor_counts`, calculate the `all` total once, and drop legacy client-side counting logic.
        – Simplified initial data flow: first render now triggers only one models request.
        – Deleted obsolete `updateVendorCounts` helper and related comments.
        – Ensured search flow also sets `vendorCounts`, keeping tab badges accurate.
      
      Why
      This refactor enforces single-responsibility (aggregation in model layer), delivers consistent totals irrespective of pagination, and removes redundant client queries, leading to cleaner code and better performance.
      t0ng7u committed
    • 🚀 refactor: refine pricing refresh logic & hide disabled models · cfb5b602
      Summary
      -------
      1. Pricing generation
         • `model/pricing.go`: skip any model whose `status != 1` when building
           `pricingMap`, ensuring disabled models are never returned to the
           front-end.
      
      2. Cache refresh placement
         • `controller/model_meta.go`
           – Removed `model.RefreshPricing()` from pure read handlers
             (`GetAllModelsMeta`, `SearchModelsMeta`).
           – Kept refresh only in mutating handlers
             (`Create`, `Update`, `Delete`), guaranteeing data is updated
             immediately after an admin change while avoiding redundant work
             on every read.
      
      Result
      ------
      Front-end no longer receives information about disabled models, and
      pricing cache refreshes occur exactly when model data is modified,
      improving efficiency and consistency.
      t0ng7u committed
    • feat: support aws bedrock apikey · d31027d5
      wzxjohn committed
    • feat: enhance soft-delete handling & boost pricing cache performance · d7428227
      Summary
      -------
      This commit unifies soft-delete behaviour across meta tables and
      introduces an in-memory cache for model pricing look-ups to improve
      throughput under high concurrency.
      
      Details
      -------
      Soft-delete consistency
      • PrefillGroup / Vendor / Model
        – Added `gorm.DeletedAt` field with `json:"-" gorm:"index"`.
        – Replaced plain `uniqueIndex` with partial unique indexes
          `uniqueIndex:<name>,where:deleted_at IS NULL`
          allowing duplicate keys after logical deletion while preserving
          uniqueness for active rows.
      • Imports updated to include `gorm.io/gorm`.
      • JSON output now hides `deleted_at`, matching existing tables.
      
      High-throughput pricing cache
      • model/pricing.go
        – Added thread-safe maps `modelEnableGroups` & `modelQuotaTypeMap`
          plus RW-mutex for O(1) access.
        – `updatePricing()` now refreshes these maps alongside `pricingMap`.
      • model/model_extra.go
        – Rewrote `GetModelEnableGroups` & `GetModelQuotaType` to read from
          the new maps, falling back to automatic refresh via `GetPricing()`.
      
      Misc
      • Retained `RefreshPricing()` helper for immediate cache invalidation
        after admin actions.
      • All modified files pass linter; no breaking DB migrations required
        (handled by AutoMigrate).
      
      Result
      ------
      – Soft-delete logic is transparent, safe, and allows record “revival”.
      – Pricing-related queries are now constant-time, reducing CPU usage and
        latency under load.
      t0ng7u committed
    • Merge pull request #1507 from QuantumNous/multi-key-manage · 2286ec06
      feat: implement channel-specific locking for thread-safe polling
      Calcium-Ion committed
  4. 04 Aug, 2025 16 commits
    • 🐛 fix(models): eliminate vendor column flicker by loading vendors before models · 607b6d4c
      Why:
      • The vendor list API is separate from the models API, causing the “Vendor” column in `ModelsTable` to flash (rendering `'-'` first, then updating) after the table finishes loading.
      • This visual jump degrades the user experience.
      
      What:
      • Updated `web/src/hooks/models/useModelsData.js`
        – In the initial `useEffect`, vendors are fetched first with `loadVendors()` and awaited.
        – Only after vendors are ready do we call `loadModels()`, ensuring `vendorMap` is populated before the table renders.
      
      Outcome:
      • The table now renders with complete vendor data on first paint, removing the flicker and providing a smoother UI.
      t0ng7u committed
    • 💄 fix(pricing-card): align skeleton responsive grid with actual card layout · a436f81e
      - Update PricingCardSkeleton grid classes from 'sm:grid-cols-2 lg:grid-cols-3'
        to 'xl:grid-cols-2 2xl:grid-cols-3' to match PricingCardView layout
      - Ensures consistent column count between skeleton and actual content
        at same screen sizes
      - Improves loading state visual consistency across different breakpoints
      t0ng7u committed
    • 🏗️ refactor: Replace model categories with vendor-based filtering and optimize data structure · f6b49dce
      - **Backend Changes:**
        - Refactor pricing API to return separate vendors array with ID-based model references
        - Remove redundant vendor_name/vendor_icon fields from pricing records, use vendor_id only
        - Add vendor_description to pricing response for frontend display
        - Maintain 1-minute cache protection for pricing endpoint security
      
      - **Frontend Data Flow:**
        - Update useModelPricingData hook to build vendorsMap from API response
        - Enhance model records with vendor info during data processing
        - Pass vendorsMap through component hierarchy for consistent vendor data access
      
      - **UI Component Replacements:**
        - Replace PricingCategories with PricingVendors component for vendor-based filtering
        - Replace PricingCategoryIntro with PricingVendorIntro in header section
        - Remove all model category related components and logic
      
      - **Header Improvements:**
        - Implement vendor intro with real backend data (name, icon, description)
        - Add text collapsible feature (2-line limit with expand/collapse functionality)
        - Support carousel animation for "All Vendors" view with vendor icon rotation
      
      - **Model Detail Modal Enhancements:**
        - Update ModelHeader to use real vendor icons via getLobeHubIcon()
        - Move tags from header to ModelBasicInfo content area to avoid SideSheet title width constraints
        - Display only custom tags from backend with stringToColor() for consistent styling
        - Use Space component with wrap property for proper tag layout
      
      - **Table View Optimizations:**
        - Integrate RenderUtils for description and tags columns
        - Implement renderLimitedItems for tags (max 3 visible, +x popover for overflow)
        - Use renderDescription for text truncation with tooltip support
      
      - **Filter Logic Updates:**
        - Vendor filter shows disabled options instead of hiding when no models match
        - Include "Unknown Vendor" category for models without vendor information
        - Remove all hardcoded vendor descriptions, use real backend data
      
      - **Code Quality:**
        - Fix import paths after component relocation
        - Remove unused model category utilities and hardcoded mappings
        - Ensure consistent vendor data usage across all pricing views
        - Maintain backward compatibility with existing pricing calculation logic
      
      This refactor provides a more scalable vendor-based architecture while eliminating
      data redundancy and improving user experience with real-time backend data integration.
      t0ng7u committed
    • Merge pull request #1499 from QuantumNous/multi-key-manage · 3c5128a6
      feat: improve layout and pagination handling in MultiKeyManageModal
      Calcium-Ion committed
    • Merge pull request #1487 from seefs001/feature/2fa · 0914d5ec
      feat: implement two-factor authentication (2FA) support with user login and settings integration
      Calcium-Ion committed
    • Merge pull request #1498 from QuantumNous/multi-key-manage · 711a7e34
      feat: add multi-key management
      Calcium-Ion committed
    • feat: add multi-key management · aeec39a1
      CaIon committed
    • feat: add model name matching rules with priority-based lookup · 12b18932
      Add flexible model name matching system to support different matching patterns:
      
      Backend changes:
      - Add `name_rule` field to Model struct with 4 matching types:
        * 0: Exact match (default)
        * 1: Prefix match
        * 2: Contains match
        * 3: Suffix match
      - Implement `FindModelByNameWithRule` function with priority order:
        exact > prefix > suffix > contains
      - Add database migration for new `name_rule` column
      
      Frontend changes:
      - Add "Match Type" column in models table with colored tags
      - Add name rule selector in create/edit modal with validation
      - Auto-set exact match and disable selection for preconfigured models
      - Add explanatory text showing priority order
      - Support i18n for all new UI elements
      
      This enables users to define model patterns once and reuse configurations
      across similar models, reducing repetitive setup while maintaining exact
      match priority for specific overrides.
      
      Closes: #[issue-number]
      t0ng7u committed
    • 💰 feat: Add model billing type (`quota_type`) support across backend & frontend · c504c9af
      Summary
      • Backend
        1. model/model_meta.go
           – Added `QuotaType` field to `Model` struct (JSON only, gorm `-`).
        2. model/model_groups.go
           – Implemented `GetModelQuotaType(modelName)` leveraging cached pricing map.
        3. controller/model_meta.go
           – Enhanced `fillModelExtra` to populate `QuotaType` using new helper.
      
      • Frontend
        1. web/src/components/table/models/ModelsColumnDefs.js
           – Introduced `renderQuotaType` helper that visualises billing mode with coloured tags (`teal = per-call`, `violet = per-token`).
           – Added “计费类型” column (`quota_type`) to models table.
      
      Why
      Providing the billing mode alongside existing pricing/group information gives administrators instant visibility into whether each model is priced per call or per token, aligning UI with new backend metadata.
      
      Notes
      No database migration required – `quota_type` is transient, delivered via API. Frontend labels/colours can be adjusted via i18n or theme tokens if necessary.
      t0ng7u committed