- 07 Aug, 2025 3 commits
-
-
✨ ✨ 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 -
t0ng7u committed
-
🎨 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
-
- 06 Aug, 2025 9 commits
-
-
Xyfacai committed
-
Xyfacai committed
-
CaIon committed
-
CaIon committed
-
CaIon committed
-
feat: support aws bedrock apikey
Calcium-Ion committed -
fix:修复添加模型倍率时的输入框锁定
Calcium-Ion committed -
feat: add support for claude-opus-4-1 model and update ratios
Calcium-Ion committed -
fix: responses cache token 未计费
Calcium-Ion committed
-
- 05 Aug, 2025 12 commits
-
-
✨ 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 -
🚀 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 -
neotf committed
-
t0ng7u committed
-
RedwindA committed
-
🚀 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 -
creamlike1024 committed
-
wzxjohn committed
-
creamlike1024 committed
-
✨ 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 -
feat: implement channel-specific locking for thread-safe polling
Calcium-Ion committed -
CaIon committed
-
- 04 Aug, 2025 16 commits
-
-
🐛 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 -
💄 - 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 -
🍎 t0ng7u committed -
t0ng7u committed
-
🏗 - **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 -
CaIon committed
-
feat: improve layout and pagination handling in MultiKeyManageModal
Calcium-Ion committed -
CaIon committed
-
feat: implement two-factor authentication (2FA) support with user login and settings integration
Calcium-Ion committed -
feat: add multi-key management
Calcium-Ion committed -
CaIon committed
-
CaIon committed
-
CaIon committed
-
CaIon committed
-
✨ 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 -
💰 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
-