1. 08 Aug, 2025 18 commits
  2. 07 Aug, 2025 22 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
    • 🎨 refactor(ui): merge “Content Configuration” into “Basic Information” card in… · f46acac6
      🎨 refactor(ui): merge “Content Configuration” into “Basic Information” card in EditPrefillGroupModal
      
      - Move `items` field (`JSONEditor` for endpoint type, `Form.TagInput` otherwise) into the first “Basic Information” card
      - Remove the second “Content Configuration” card and its header; consolidate to a single-card layout
      - Preserve form initialization, validation, and submit logic; API payload structure remains unchanged
      - Improves clarity and reduces visual clutter without altering behavior
      - Lint passes
      
      Affected file:
      - `web/src/components/table/models/modals/EditPrefillGroupModal.jsx`
      
      No breaking changes.
      t0ng7u committed
    • feat: Improve models UX and robustness: add JSONEditor extraFooter, fix… · 908714b7
       feat: Improve models UX and robustness: add JSONEditor extraFooter, fix endpoints rendering, and clean up deps
      
      - Why
        - Needed to separate help text from action buttons in JSONEditor for better layout and UX.
        - Models table should robustly render both new object-based endpoint mappings and legacy arrays.
        - Columns should re-render when vendor map changes.
        - Minor import cleanups for consistency.
      
      - What
        - JSONEditor.js
          - Added optional prop extraFooter to render content below the extraText divider.
          - Kept extraText rendered via Divider; extraFooter appears on the next line for clear separation.
        - EditModelModal.jsx
          - Moved endpoint group buttons from extraText into extraFooter to display under the helper text.
          - Kept merge-logic: group items are merged into current endpoints JSON with key override semantics.
          - Consolidated lucide-react imports into a single line.
        - ModelsColumnDefs.js
          - Made endpoint renderer resilient:
            - Supports object-based JSON (keys as endpoint types) and legacy array format.
            - Displays keys/items as tags and limits the number shown; uses stringToColor for visual consistency.
          - Consolidated Semi UI imports into a single line.
        - ModelsTable.jsx
          - Fixed columns memoization dependency to include vendorMap, ensuring re-render when vendor data changes.
      
      - Notes
        - Backward-compatible: extraFooter is additive; existing JSONEditor usage remains unchanged.
        - No API changes to backend.
        - No linter errors introduced.
      
      - Files touched
        - web/src/components/common/ui/JSONEditor.js
        - web/src/components/table/models/modals/EditModelModal.jsx
        - web/src/components/table/models/ModelsColumnDefs.js
        - web/src/components/table/models/ModelsTable.jsx
      
      - Impact
        - Clearer UI for endpoint editing (buttons now below helper text).
        - Correct endpoints display for object-based mappings in models list.
        - More reliable reactivity when vendor data updates.
      t0ng7u committed
    • 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
    • Merge pull request #1517 from RedwindA/fix/gemini-fetch-models · e69b5c45
      Fix/gemini-fetch-models
      Calcium-Ion committed
    • Merge pull request #1518 from RedwindA/fix/disable-gemini-sse · cdc6ab61
      Fix/disable-gemini-ping
      Calcium-Ion committed
    • Merge pull request #1522 from QuantumNous/support-deepseek-claude · 705e5edd
      feat: support deepseek claude format (convert)
      Calcium-Ion committed
    • Merge pull request #1521 from QuantumNous/support-qwen-claude · 65b12d77
      feat: support qwen claude format
      Calcium-Ion committed