1. 09 Aug, 2025 14 commits
  2. 08 Aug, 2025 19 commits
  3. 07 Aug, 2025 7 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