- 09 Aug, 2025 13 commits
-
-
Merge pull request #1534 from HynoR/feat/je
同語 committed -
t0ng7u committed
-
🐛 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 -
CaIon committed
-
fix: Gemini embedding model only embeds the first text in a batch
Calcium-Ion committed -
feat: add video preview modal
Calcium-Ion committed -
fix(midjourney): 为 Midjourney 任务添加视频 URL 字段
Calcium-Ion committed -
fix: 当OIDC的AuthUrl带有param时,跳转参数拼接错误
Calcium-Ion committed -
feats:replace GLM-4v authentication headers to support customize api key
Calcium-Ion committed -
📱 * 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 -
✨ 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 -
🔧 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 -
🎨 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
-
- 08 Aug, 2025 19 commits
-
-
Yincmewy committed
-
HynoR committed
-
CaIon committed
-
CaIon committed
-
feat: 完善格式转换,修复gemini渠道和openai渠道在claude code中使用的问题
Calcium-Ion committed -
CaIon committed
-
t0ng7u committed
-
🔧 Changes 1. ModelPricingTable.jsx • Compute `autoChain` as the intersection of `autoGroups` and the model’s `enable_groups` (order preserved). • Display the chain banner only when `autoChain.length > 0`; banner shows the reduced path (e.g. `a → c → e`). • Dropped obsolete `selectedGroup` prop; all callers updated. 2. ModelDetailSideSheet.jsx / PricingPage.jsx • Removed forwarding of deleted `selectedGroup` prop. Outcome – “Auto group routing” appears only for models that actually participate in the chain, avoiding empty or irrelevant banners. – Codebase simplified by eliminating an unused prop.
t0ng7u committed -
fix: ensure last message is sent successfully
Calcium-Ion committed -
t0ng7u committed
-
🚀 Detailed changes Backend • `controller/pricing.go` now includes `auto_groups` in `/api/pricing` response, sourced from `setting.AutoGroups`. Frontend • `useModelPricingData.js` – Parses `auto_groups` and exposes `autoGroups` state. • `PricingPage.jsx` → `ModelDetailSideSheet.jsx` → `ModelPricingTable.jsx` – Thread `autoGroups` through component tree. • `ModelPricingTable.jsx` – Removes deprecated `getGroupDescription` / `Tooltip`. – Filters out `auto` when building price table rows. – Renders a descriptive banner: “auto 分组调用链路 → auto → group1 → …”, clarifying fallback order without showing prices. • Minor i18n tweak: adds `auto分组调用链路` key for the banner text. Why Users were confused by the “auto” tag appearing alongside regular groups with no price. This change: 1. Makes the routing chain explicit. 2. Keeps the pricing table focused on billable groups. No breaking API changes; existing clients can ignore the new `auto_groups` field.
t0ng7u committed -
CaIon committed
-
CaIon committed
-
CaIon committed
-
- Updated the model list to include various gpt-5 variants. - Enhanced the ConvertOpenAIRequest function to handle gpt-5 model temperature settings based on specific model prefixes. - Adjusted default cache and model ratios for new gpt-5 models.
CaIon committed -
feat: sync gpt-5 model ratio and support new reasoning effort
Calcium-Ion committed -
fix: 修复通配符处理对判断可用渠道的破坏
Calcium-Ion committed -
HynoR committed
-
feitianbubu committed
-
- 07 Aug, 2025 8 commits
-
-
✨ - 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 -
💄 - 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 -
-
🐛 - 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.jst0ng7u committed -
♻ ♻ ️ 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.got0ng7u committed -
♻ - 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 -
🤔 t0ng7u committed -
🤔 t0ng7u committed
-