Compare commits

...
1748 Commits
Author SHA1 Message Date
lofyerandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> 853095d951 feat(layout): move navigation menu from sidebar to top header
Switch ProLayout to top layout with a custom horizontal HeaderMenu
(dropdowns for grouped items) and relocate the user/help/version actions
into the header right area.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-07-24 15:50:15 +08:00
lofyerandClaude Opus 4.8 99c95b87e5 feat(branding): rebrand footer vendor to MesaStack, trim footer/topbar
- Footer vendor label unified to "MesaStack" across all locales.
- Remove footer Help button; keep version as plain text (no click).
- Remove top-right GitHub star widget (delete unused github-star.tsx);
  keep version as plain text (no click), retain upgrade "New" badge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 15:50:15 +08:00
lofyerandClaude Opus 4.8 39a6455e7b docs(agents): document rebrand step in fork workflow
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 15:50:05 +08:00
lofyerandClaude Opus 4.8 958c7ef201 feat(branding): rebrand user-facing GPUStack to MesaStack
Applied via scripts/rebrand across UI labels, page title, and all
locale strings (en/zh/ja/ru/tr). Functional references untouched:
npm package, URLs, paths, JS identifiers, GPUSTACK_ constants, and the
X-GPUStack-Model header. The backend-contract startsWith string in
llmodels/hooks keeps "GPUStack server" to stay matchable. Logo images
intentionally left unchanged for now.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 15:49:20 +08:00
lofyerandClaude Opus 4.8 542289a318 feat(scripts): add rebrand script to swap brand identity
Replace the standalone "GPUStack" brand word with a target brand
(default MesaStack) across user-facing text. Word-boundary + case-
sensitive matching deliberately skips functional references: lowercase
gpustack (npm pkg/URLs/paths/k8s ns), ALL-CAPS GPUSTACK_ constants,
JS identifiers (getGPUStackPlugin etc.), and X-* HTTP headers. A
line-level skip list protects backend-contract strings matched at
runtime (e.g. the model-file-not-found startsWith check).

Re-run on each new v<version>-lofyer branch after syncing upstream.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 15:49:20 +08:00
lofyerandClaude Opus 4.8 5c1bbe5bf7 docs(agents): document downstream fork sync workflow
Describe the upstream->private mirror chain, the v<version>-lofyer branch
naming for appearance customizations, and how to run scripts/sync-github.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 15:48:48 +08:00
lofyerandClaude Opus 4.8 f26abd4b5f feat(scripts): add sync-github to mirror upstream to private registry
Fetch all branches and tags from upstream GitHub and force-push them to
the 192.168.0.23 private origin (full mirror). Supports DRY_RUN and an
opt-in PRUNE_BRANCHES for true mirroring.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 15:48:16 +08:00
jialin 2767f883fc fix(dashboard): remove date from group_by
CI / deps (push) Has been cancelled
CI / build (push) Has been cancelled
CI / build-publish (push) Has been cancelled
2026-07-02 11:45:52 +08:00
jialin e98651da2b feat(dashboard): split top user token usage into prompt/completion 2026-07-02 10:13:52 +08:00
jialinandjialin 84304eadb7 fix(playgroundimage): allow to input size 2026-06-18 16:03:35 +08:00
jialinandjialin ab3739219e chore: update vllm, sglang, preset argument options 2026-06-18 16:03:35 +08:00
jialinandjialin 7cf4932f3a fix(deploymentlog): show the checkbox only when container exsiting previous 2026-06-18 11:50:19 +08:00
jialinandjialin 032f1eefef fix(deployments): show a prefix before model name in playground 2026-06-18 11:50:19 +08:00
jialinandjialin e35be94f7c fix(provider): filter bailian do not work 2026-06-18 11:50:19 +08:00
jialinandjialin e76e2ad85a fix(worker): IP cell text wrapping 2026-06-18 11:50:19 +08:00
jialinandjialin cb19cd2476 fix: show cpu only spec info 2026-06-17 20:11:06 +08:00
jialinandjialin c532732ce9 fix: show CPU Only in usage instanc types 2026-06-17 18:29:58 +08:00
jialinandjialin 2bc10dbb2e fix: bailian logo, instance logs params container_name 2026-06-17 16:49:25 +08:00
jialinandjialin b634a03ef9 fix: use alibaba cloud icon for qwen provider 2026-06-17 15:30:43 +08:00
jialinandjialin ac64bb98ad fix: Only display name editable when editing storage and storage type 2026-06-17 12:35:24 +08:00
jialinandjialin aa49539210 fix: select gpu stype when creating cluster from gpu service 2026-06-17 12:35:24 +08:00
jialinandjialin 1f5678f781 fix: update nividia notes 2026-06-17 12:35:24 +08:00
jialinandjialin 7adc089e94 fix: save the default_width, default_height in image size options 2026-06-17 12:35:24 +08:00
jialinandjialin 6e1e9c07ee fix: template name readonly in editting 2026-06-17 11:06:39 +08:00
jialinandjialin 1d55382f3b fix: fetch all model instance after stopping 2026-06-17 11:06:39 +08:00
jialinandjialin e68bb0bc4e fix: export data should contain all tables 2026-06-16 22:28:46 +08:00
jialinandjialin c8e14dade5 fix: remove vendor logo in template list 2026-06-16 22:28:46 +08:00
jialinandjialin e4c1a3f5c2 refactor: usage instance tab, split tables 2026-06-16 22:28:46 +08:00
jialinandjialin cdd6ef9cb3 refactor: use hook for fetch event 2026-06-16 22:28:46 +08:00
jialinandjialin 737d43fd16 refactor: use hook for fetch chart 2026-06-16 22:28:46 +08:00
jialinandjialin 9f5163531c refactor: usage storage tab, split tables 2026-06-16 22:28:46 +08:00
jialinandjialin df5cf0f4e5 chore: nvidia notes in add worker 2026-06-16 18:35:19 +08:00
jialinandjialin e160b64697 fix: do not show billing menu in ent 2026-06-16 18:35:19 +08:00
jialinandjialin 7d36c6ac4a revert: show model name from api directly in apikeys 2026-06-16 15:25:46 +08:00
jialinandjialin 0820edf55f fix: refresh data in card page list 2026-06-16 15:25:46 +08:00
jialinandjialin 12e324893f fix: gpu instance state color 2026-06-16 14:17:43 +08:00
jialinandjialin 4017c4dd33 style: table hover bg, remove description in billing 2026-06-16 14:17:43 +08:00
jialinandjialin 17b65d80e1 fix(style): API info access url overflow 2026-06-16 14:17:43 +08:00
jialinandjialin 47cb3321ab fix(style): forgot password layout 2026-06-16 14:17:43 +08:00
jialinandjialin 547b9f617b fix(style): forget button in login page 2026-06-15 15:48:41 +08:00
jialinandjialin 9e7bd78693 fix: allowed models do not contain the org name 2026-06-15 14:45:27 +08:00
jialinandjialin c53d60b628 fix: remove the depude code in buildTrend 2026-06-14 19:40:19 +08:00
jialinandjialin 9566e0cdb2 fix: queryParams do not be updated timely 2026-06-14 19:21:36 +08:00
jialinandjialin ed3e779d22 fix: do not trigger setInitialized in catch when error occured 2026-06-14 19:14:18 +08:00
jialinandjialin 3e2133753d fix: barchart, piechart flash issue 2026-06-14 19:14:18 +08:00
jialinandjialin 736a853192 chore: add cancel token 2026-06-14 19:14:18 +08:00
jialinandjialin 08ef2ffa9a refactor(usagesummary): fetch data 2026-06-14 19:14:18 +08:00
jialinandjialin 6cf512cccd refactor(usage): split tabs into separate dirs 2026-06-14 19:14:18 +08:00
jialinandjialin 6f56e614f3 chore: instance creationg UE 2026-06-14 19:14:18 +08:00
jialinandjialin 8c06862705 style: login placeholder 2026-06-12 22:20:31 +08:00
jialinandjialin 48159171c2 fix: keep uniform for instance type render content 2026-06-12 22:20:31 +08:00
jialinandjialin d5d0749b72 chore(deps): update ui 1.0.27 2026-06-12 21:16:07 +08:00
jialinandjialin dc4dd81e11 refactor(login): layout style 2026-06-12 21:16:07 +08:00
jialinandjialin c736e2186d revert: display the max count cpu instance type 2026-06-12 20:49:47 +08:00
gitlawr 7a76bda484 feat: distinguish same-name GPU service resources across users
Resource names are unique per owning principal, so different users
can legally create same-name GPU instances, templates, SSH public
keys, storage volumes and storage types — but the admin's
cross-tenant lists and the instance-create template picker rendered
them indistinguishably.

- Group the template picker by owning scope: Your Templates, Global
  Templates, then — admin cross-tenant view only — one group per
  owner. A single group renders flat without headers. A plugin can
  take over grouping via hooks.useTemplateOwnerGroups when its
  principal model scopes templates beyond USER owners; a plugin
  without the hook keeps the flat list.
- Add an admin-only Creator column to the Instances, SSH Public
  Keys, Storage and Storage Types tables, sitting right before
  Created (mirroring the API Keys page convention). Resolves
  creator_id to a username via the user directory, falling back to
  owner_principal_id for legacy rows — a personal-scope row's
  creator IS its owner.
- Tag template cards with their owner scope (Global / username) for
  admins.

The Creator column and the card tag defer to a plugin that registers
the page's list columns / the OwnerScopeTag slot. Requires the
gpustack server change that records creator_id on templates, SSH
public keys and storage types.
2026-06-12 20:22:56 +08:00
yxfandjialin 778ea36a9d refactor(parameter): rename parameter_format to Flag Format and update related logic 2026-06-12 17:12:10 +08:00
jialinandjialin 04e1e1e566 chore: remove remember me 2026-06-12 16:02:22 +08:00
jialinandjialin 01f66085ab fix: only keep the max count cpu instance type 2026-06-12 16:02:22 +08:00
jialinandjialin ddf723525a fix: instance types switch between gpu and cpu 2026-06-12 12:10:14 +08:00
Yuxing Deng 7b18a92388 fix: register k8s cluster should selected nvidia vendor by default 2026-06-11 23:55:40 +08:00
jialinandjialin b985dcee63 chore(deps): update ui 1.0.26 2026-06-11 20:31:36 +08:00
jialinandjialin 77e92432ed fix: changed notice always display 2026-06-11 20:02:27 +08:00
jialinandjialin a7b33a928b fix: anti double submit in form 2026-06-11 20:02:27 +08:00
jialinandjialin 1218c6d096 fix: prevent duplicate submit and unlock on validation failure in deploy/update modals 2026-06-11 20:02:27 +08:00
jialinandjialin 6337431ed4 chore(deps): update ui 1.0.25 2026-06-11 14:13:08 +08:00
jialinandjialin 2ba5118bc2 fix: filter modelInstance by cluster in benchmark form 2026-06-11 14:13:08 +08:00
jialinandjialin 12649c7ccf chore(deps): update ui 1.0.24 2026-06-10 20:29:50 +08:00
jialinandjialin 5d96932870 fix: logs viewer scroll to bottom aumatically 2026-06-10 20:29:50 +08:00
jialinandjialin e6cfa6cf77 fix: template display after initialized 2026-06-10 20:29:50 +08:00
gitlawrandjialin 55d16c5681 feat: persist sider menu group collapse state across refresh 2026-06-10 20:24:53 +08:00
micheliaandjialin ab75685955 fix: extend usage query limit 2026-06-10 16:17:54 +08:00
micheliaandjialin bd0bf0bf63 fix(usage): render resource timestamps in their rollup tz, not browser-local 2026-06-10 16:17:54 +08:00
jialinandjialin fd050b33d9 fix: dedupe backend params when switching backend 2026-06-10 15:37:27 +08:00
jialinandjialin 698090b17a fix: watch list do not update when creating 2026-06-10 15:37:27 +08:00
jialinandjialin 6f96260993 fix(style): pie legend text overflow 2026-06-10 15:37:27 +08:00
jialinandjialin 98a6b19298 fix: flatten all filters in table list 2026-06-10 15:37:27 +08:00
Yuxing Dengandjialin ded270ff25 feat: support deploying cpu workers for k8s cluster 2026-06-10 15:26:13 +08:00
gitlawrandjialin c8860207e8 feat(apikeys): wire Organization plugin column on API Keys list
Splice the per-page extra-columns slot ('apiKeys') after the Name
column so plugin-contributed columns (e.g. Organization in the admin
All-org view) render on the API Keys list, matching the other resource
list pages. Declare owner_principal_id (and the already-consumed
masked_value / user_name / user_id) on ListItem.
2026-06-10 14:46:12 +08:00
gitlawrandjialin 8d045ffd8b feat(header): add GitHub star button to top bar
Compact pill (GitHub icon | star count) placed left of the version
display. Star count is fetched from the GitHub API once per 24h and
cached in localStorage; the button hides entirely when no count is
available (e.g. air-gapped deployments), matching the existing update-
check graceful-degradation pattern. Fetch is bounded by a 4s abort
timeout to avoid hanging requests offline.
2026-06-10 12:00:35 +08:00
jialinandjialin fd7437e74a fix: show start only on stopped 2026-06-10 10:03:43 +08:00
jialinandjialin 807ba866d3 fix: only ready allow deleting 2026-06-09 21:00:17 +08:00
jialinandjialin 5e2808d7c4 fix(style): usage model name overflow 2026-06-09 20:01:11 +08:00
jialinandjialin a26a3ff8f9 fix: safe mergeBackendParameters 2026-06-09 20:01:11 +08:00
jialinandjialin a2e9f69b96 fix: gpu instance always show delete, dedupe params 2026-06-09 19:01:32 +08:00
Yuxing Dengandjialin ac800a303a fix: remove the pined worker config changed notice 2026-06-09 17:54:23 +08:00
yxfandjialin dd542a9f29 feat(params): add initialization attributes to lock task_type field 2026-06-09 16:30:35 +08:00
gitlawrandjialin 26ce456bde feat: per-page extra-columns slot for list tables
Add `usePluginListColumns(pageKey)` so a registered plugin can splice
extra columns into a list page's columns hook keyed by page id. The
slot is wired into 11 list pages (Models, Model Routes, Clusters,
Cloud Credentials, MaaS Providers, Model Files, Model Instances,
GPU Service Instances / Public Keys / Storage / Storage Types) so any
consumer of the seam reaches every org-scoped list without per-page
plumbing.

The slot accepts either a static array or a hook function — the hook
form lets the registrant use React hooks to decide visibility without
the host having to evaluate it. Columns carry a `placement`:
`after-name` is the default (sits next to the row's identifying
column); `before-time` / `before-operation` are kept for back-compat
with the existing per-page `modelRoutes.extraColumns` slot.

SealTable-grid pages (Models / Model Routes / Clusters) absorb the
plugin column's span by shrinking the widest right-side columns so
the 24-unit grid stays balanced. Model Routes' `CREATE_TIME_MIN_SPAN`
drops from 3 to 2 because with two plugin columns active the grid
was 1 unit over and the action dropdown wrapped onto a new row; the
date string ellipsizes cleanly at the lower min.

ListItem types for Model Instances, MaaS Providers, Cloud Credentials,
and Model Files gain an optional `owner_principal_id` field — the
backend already emits it (denormalized from the parent resource), the
TS types just hadn't declared it.

The GPU Instances page splices the plugin column right before the
Cluster column (rather than after Name); the two read together since
Cluster narrows down to one Org.
2026-06-09 16:28:59 +08:00
micheliaandmichela feng 7ce1faaf6c fix(usage): format Last Active as local time on GPU & Storage tabs
The Last Active column had no renderer, so it dumped the raw ISO timestamp
(gpustack/gpustack#5523). It's a UTC instant (max bucket hour), so format it
to the user's local time with dayjs — matching the Resource Events time
column and the rest of the product. (Token Last Active is a daily date, not
an instant, so it stays a plain date with no timezone shift.)
2026-06-09 11:54:28 +08:00
micheliaandmichela feng 878bdaa5a7 fix(usage): keep the grouped-trend legend off the x-axis labels
The legend renders at the chart bottom (bottom: 0); with the default grid
(bottom: 8) it overlapped the date labels once a group-by split the trend
into multiple series. Reserve grid bottom space (matching the Tokens trend)
whenever a legend is shown.
2026-06-09 11:54:28 +08:00
micheliaandmichela feng 68a7e3f66a feat(usage): group-by on the GPU Instances & Storage trend charts
Mirror the Tokens trend: add a clearable "Group by" select to the
MetricChartCard so the GPU Instances chart can split by instance type /
instance / user, and Storage by storage / user. When grouped, the chart
fetches group_by=["date", "<dim>"] (the same list style as the token usage
API) and pivots into one stacked series per group (shared buildTrendSeries
util), with a legend; ungrouped stays a single series. group_by is now a
list across the resource breakdown client; group-by options reuse the
bottom-table dimensions (Users only when org-wide).
2026-06-09 11:54:28 +08:00
micheliaandmichela feng feccc81c5f feat(usage): fix Resource Events filters — real event types, name search, no user filter
- Event type: trim the dropdown to the four types that are actually emitted
  (Created / Started / Stopped / Deleted) — updated/attached/detached were
  never recorded — and actually send the selection (event_types) to the API,
  which previously dropped it so the filter did nothing.
- Add a resource-name text filter (debounced, case-insensitive substring).
- Remove the "filter by user" select: the events list has no User column.
  Scope still applies (members see only their own events).
2026-06-09 11:54:28 +08:00
jialinandjialin 620045d7a3 fix: show the default backend params configured in backend 2026-06-08 18:25:22 +08:00
jialinandjialin 6dc28d61b0 fix: view event in starting 2026-06-08 18:25:22 +08:00
jialinandjialin 754cc29793 chore: update iconfont files 2026-06-08 16:38:27 +08:00
jialinandjialin ed525509ea chore(deps): update 1.0.23 2026-06-08 16:26:25 +08:00
jialinandjialin 2b6f26e6c8 fix: update addworker command for dtk 2026-06-08 15:43:21 +08:00
jialinandjialin 09821aab85 feat: add a billing holder page 2026-06-08 15:43:21 +08:00
jialinandjialin 636190b8e6 chore: show the backend info in instance view 2026-06-08 15:43:21 +08:00
jialinandjialin e420c22a45 fix(style): bar chart legend gap 2026-06-08 11:42:20 +08:00
jialinandjialin 993f6edcc4 fix: error message do not show in tts 2026-06-08 11:42:20 +08:00
gitlawr bda8264788 fix: playground model id alignment across org boundaries
Two QA-reported bugs on the "Open in Playground" path. Both come
down to the model id the playground submits not matching what
``/v1/models`` / the dispatcher key off:

* Routes page (OSS UI) emitted ``default/<name>`` for routes in the
  platform Org and 404'd. ``use-open-playground`` keyed off the
  ``is_platform`` flag alone; stale caches that drop the flag
  slipped through. Also accept the well-known ``name === 'default'``
  (``PLATFORM_PRINCIPAL_NAME`` on the backend) as a fallback signal.

* My Models page (enterprise UI, non-admin) emitted bare ``<name>``
  with no Org prefix for non-platform routes. Use ``model.name``
  from ``/v2/my-models`` verbatim — the backend ("fix: principal
  prefix in my-models") now rewrites that field to the OpenAI-style
  id server-side, which also closes the cross-Org grant gap a
  client-side cache lookup can't (the granting Org isn't in the
  caller's member list). Card title now shows the prefixed id, so
  users can tell apart same-named models from different Orgs.

Routes page keeps ``useOpenPlayground`` — that surface is always
scoped to the caller's own Org, the local cache is sufficient, and
``/model-routes`` still returns the raw ``name``.

Also drops the now-unused ``onClick`` prop on ``ModelItem``: the
card had ``clickable={false}`` so the parent-passed handler was
already dead code; the Button drives the playground navigation.
2026-06-07 15:45:49 +08:00
gitlawr ab8e792276 feat(cluster): card-based cluster type selector for K8s
Replace the GPU Service switch (with the small "cannot be used for
model service" caption) with a two-card radio selector that makes the
choice between Model Service and GPU Service explicit at a glance.

- Render two cards styled to match the existing SwitchCard (same
  border, radius, 12px/14px padding, and label/description typography)
  so the selector blends in with the surrounding form fields.
- Underlying form state is unchanged: picking GPU Service still seeds
  k8s_options.gpuInstanceOptions = {}, picking Model Service clears
  it — so the static-address field, the EDIT-mode change watcher, and
  the API payload all keep working as before.
- Align the GPU Service label with the top-level menu entry
  (menu.gpuService) — drop "Instance" / "实例" from the card title
  and the static access address label.
2026-06-07 13:44:50 +08:00
jialinandjialin 0e4be63b6b chore(gaas): add a unknown phase 2026-06-06 21:09:56 +08:00
jialinandjialin d3ebea9090 fix: locales, empty link in add worker 2026-06-06 14:29:49 +08:00
jialinandjialin 15a9e23243 fix: convert cpu unit to core 2026-06-06 14:29:49 +08:00
jialinandjialin eab7d9c77f style: usage chart 2026-06-06 14:29:49 +08:00
jialinandjialin 4a86b71018 fix: ignore request errors on setup 2026-06-06 14:29:49 +08:00
jialinandjialin 6350f7f11a chore(i18n): usage locales 2026-06-05 23:59:25 +08:00
jialinandLawrence Li ce6388253c fix: cpu init value failed 2026-06-05 23:08:45 +08:00
jialinandLawrence Li d8f6064d5e fix: usage locales 2026-06-05 23:08:45 +08:00
jialinandLawrence Li 9f5d95f565 fix: align instance type fields to api 2026-06-05 23:08:45 +08:00
jialinandjialin 0cabbeb81c fix(style): cluster detail locale 2026-06-05 22:29:39 +08:00
jialinandjialin 76618aa3a1 fix(style): cluster detail 2026-06-05 22:18:26 +08:00
gitlawrandjialin b19db0f67d fix(clusters): call out that GPU instance service blocks model service
The "GPU Instance Service" toggle on the cluster create form only said
what it enables. The exclusion side — once flipped, the cluster drops
out of the model-deploy picker — was invisible until the user went
looking for the cluster elsewhere. Extend the tip to spell that out
in all five locales, using the canonical "GPU instance service" /
"model service" product terms.
2026-06-05 18:56:42 +08:00
gitlawrandjialin 76f228bfe7 fix(llmodels): hide GPU-service clusters from deploy picker
The deploy form's cluster dropdown fetched every visible cluster, so
clusters configured for GPU-service (k8s_options.gpu_instance_options
set) showed up as deployable targets even though deployments cannot
run on them.

Pass gpu_instance_enabled=false on the cluster-list query so the
backend returns only model-deployment clusters. GPU-instance creation
does not pick a cluster directly (it is derived from the instance
type), so no symmetric change is needed there.
2026-06-05 18:56:42 +08:00
gitlawrandjialin be40692773 feat(login): add onUserFetched plugin hook
The host's access function is memoized on `initialState` and runs
exactly once per commit. Plugins that maintain identity-scoped
caches the access predicate reads from (e.g. an org context cache)
had no way to seed those caches synchronously before the caller's
`setInitialState({currentUser: ...})` fired — any post-commit hydrate
couldn't widen the predicate, leaving the sidebar in a stale view
until the next identity change.

Add `LoginPlugin.onUserFetched(userInfo, ctx)` and call it inside
`fetchUserInfo` after the server confirms identity but before
returning. Also commit the identity to `userAtom` storage here so
localStorage's identity marker is in lockstep with whatever caches
the plugin seeds — the predicate's first evaluation then sees a
consistent view rather than the prior session's data.

Errors thrown from the hook are swallowed and logged; they never
block fetchUserInfo.
2026-06-05 18:55:46 +08:00
gitlawrandjialin 42ac377c17 feat: tease enterprise multi-tenancy and API key controls in OSS
Add an Organizations menu entry (admin-only) that routes to an upsell
page explaining the multi-tenancy module, and surface disabled
IP Access Control / Quota Limit items in the API Key dropdown with a
tooltip pointing at the enterprise edition. Both placeholders are
shadowed by the enterprise plugin at build time: the route merger
removes the OSS Organizations entry by name, and the dropdown skips
each placeholder when the same key is contributed via configActions.
2026-06-05 16:41:34 +08:00
jialinandjialin 46f859cc3c fix: no need to show error in login for first 2026-06-05 16:24:46 +08:00
gitlawrandjialin f2bff0d1fb fix(storage): remove duplicate error toast on create failure 2026-06-05 16:20:49 +08:00
gitlawrandjialin 0bd98b9662 fix(llmodels): scope catalog deploy cluster seed by create-scope org
initClusterId picked the platform default cluster without considering
the form's organization_id, so opening the catalog deploy form in the
admin all-scope view could seed a cluster that the (org-filtered)
dropdown then hides — submit failed with "Cluster not found".

Mirror the same scope-aware selection deploy-modal already does:
filter clusterList by owner_principal_id when organization_id is set
before picking default/ready/first.

Return number | undefined honestly (the picked org may own no
clusters, or clusterList may still be loading) and guard the
open-handler caller so undefined doesn't flow into fetchSpecData /
getGPUOptionList — the user resolves the empty state by picking an
org that owns clusters.
2026-06-05 13:11:41 +08:00
micheliaandjialin 1ac2c02197 fix: change benchmark model name query condition to input 2026-06-05 12:30:25 +08:00
jialinandjialin 907187d53a fix: show worker added message 2026-06-05 10:20:55 +08:00
Yuxing Dengandjialin faf6246fe6 fix: remove worker config bg color 2026-06-05 10:19:08 +08:00
Yuxing Dengandjialin 0c16e2be7a fix: add notification when editing cluster's k8s_options 2026-06-05 10:19:08 +08:00
micheliaandjialin 3212882895 chore(menu): move Usage below Resources in the sidebar 2026-06-04 19:52:52 +08:00
micheliaandjialin 62f34ffcaf feat(usage): resource usage metering page
Add the Usage page with Summary / Tokens / GPU Instances / Storage / Resource
Events tabs over the new metering endpoints: per-resource breakdowns with
date / scope / user / resource filters, trend charts, server-side sortable
tables (GPU-Hours, Instance-Hours, GB-Days, GB-Hours), Excel export with an
in-dialog preview, and KPI cards with help tooltips explaining each metric.

MaaS-only users (no Kubernetes cluster and no resource events) get a
tokens-only view with the tab bar dropped; GPU Service / the full page unlock
for admins, cluster owners, or anyone who has run a resource. Instance-type
rows reuse the GPU Instances list styling, and deleted users / instances /
volumes are flagged in breakdowns and filters.
2026-06-04 19:52:52 +08:00
micheliaandjialin 50601b0aff feat(gpu-service): instance-type spec popover with per-card specs
Replace the raw flavor slug in the GPU Instances list with the product name
("<product> x <count>") plus an info-icon popover that breaks the spec down by
category (GPU / CPU / Memory / Disk): per-card VRAM, whole-instance CPU/RAM,
system / ephemeral / persistent disks (persistent size resolved from the
referenced PV). Extract the cell into a shared InstanceTypeCell and centralize
memory formatting in formatMemoryDisplay so the GPU Instances list and the
Usage tab render identical sizes.
2026-06-04 19:52:52 +08:00
gitlawrandjialin 4c5d42cb13 feat(version): respect GPUSTACK_UI_* env overrides in build info
Allow a wrapping build that checks this source tree out as a
sub-package to stamp its own release tag and commit id onto the UI
(otherwise the version panel reports the host tree's git HEAD,
which the wrapper doesn't control).

GPUSTACK_UI_VERSION overrides the release tag and GPUSTACK_UI_COMMIT_ID
overrides the short commit id; both fall back to the git tag /
commit at HEAD when unset, preserving existing behavior. Names are
namespaced to avoid colliding with the many tools and CI runners
that already set a generic VERSION.
2026-06-04 18:21:13 +08:00
gitlawrandjialin 85268b8917 fix(api-keys): scope creator filter to current org members
The "Filter by creator" dropdown was listing every user in the
system. For an Org owner viewing an Org-scoped key list, picking
a user outside the Org always produced an empty result. Pass
scope=current_org to `/user-directory` so the picker matches the
list's actual scope. BE drops the param when the request has no
Org context, so callers without an Org are unchanged.
2026-06-04 18:09:32 +08:00
gitlawrandjialin 973d2c4529 feat(login): add plugin seam for default landing path
Plugins can supply `LoginPlugin.resolveDefaultPath` to override the
post-login redirect target. checkDefaultPage consults the hook and
uses the returned path when non-null; otherwise falls back to the
existing admin/non-admin defaults. The lookup runs in parallel with
the IS_FIRST_LOGIN read. Applies to both first-login and
subsequent-login flows.
2026-06-04 15:56:24 +08:00
jialinandjialin ab766b8c54 style: menu collapse button 2026-06-04 15:48:44 +08:00
jialinandjialin 4945242c87 style: login page size 2026-06-04 15:48:44 +08:00
jialinandjialin c4a72eb375 style: collapse style 2026-06-04 15:48:44 +08:00
gitlawrandjialin b12d11728d fix: update model files menu access 2026-06-04 13:16:47 +08:00
Yuxing Dengandjialin 8f0e3a7576 fix: remove k8s options section and merge into advance
And re-order the configuration inputs. The current input order is:
- namespace
- volume mounts
- registry credentials
- node selector
- system-default-registry
- operator image
- gpu instance static access address
- worker config yaml
2026-06-03 23:17:38 +08:00
Yuxing Dengandjialin 4810ff2dbe fix: enhance cluster create form 2026-06-03 23:17:38 +08:00
jialinandjialin a221b22be9 style: instance type data format 2026-06-03 21:29:31 +08:00
jialinandjialin 24b458530d fix(style): sso button width 2026-06-03 21:29:31 +08:00
jialinandjialin caea43590a chore: useMemo deps 2026-06-03 18:28:31 +08:00
jialinandjialin c3d7a0b85e chore: add locales 2026-06-03 18:28:31 +08:00
jialinandjialin 5c6f28027d chore: add locales 2026-06-03 18:28:31 +08:00
jialinandjialin dc04529f5b fix: vendor options display by locales 2026-06-03 18:28:31 +08:00
jialinandjialin 2bb04a419d fix: sshkey, storage selection displayName 2026-06-03 18:28:31 +08:00
jialinandjialin 8e31b71668 chore: merge cluster menu to resource 2026-06-03 18:28:31 +08:00
micheliaandmichela feng f055453889 fix(usage): defensive optional-chaining on breakdown items + sku 2026-06-03 17:10:51 +08:00
micheliaandmichela feng 820a6cecdd fix(gpu-service): avoid stringifying unset cpu in the instance form
`${values.spec?.resources?.cpu}` turned an unset cpu into the literal
string "undefined", which fails k8s quantity validation. Omit cpu when
it has no value instead.
2026-06-03 17:10:51 +08:00
micheliaandmichela feng c3a779e4c8 feat(usage): register the Usage route and menu group
Add the /usage menu folder with its overview child pointing at the
tabbed Usage page.
2026-06-03 17:10:51 +08:00
micheliaandmichela feng 00008abf03 feat(usage): add the tabbed Usage page
A Tabs shell hosting Tokens / GPU Instances / Storage / Summary /
Resource Events:
- token-tab: the original token view, wrapped as a tab.
- gpu-instances-tab & storage-tab: per-instance / per-volume breakdowns
  with KPI cards, a metric+granularity trend chart, and grouped tables.
- summary-tab: three-domain (Tokens / Compute / Storage) overview with
  headline stats, donut, and trend.
- resource-events: the lifecycle audit log (Started / Stopped).
- resource-filter-bar + metric-chart-card: shared filter / chart controls
  mirroring the Tokens tab.
- resource-export-data: a preview modal (filter + paginated preview, then
  download) backing the Export Chart Data / Export Table Data actions.
2026-06-03 17:10:51 +08:00
micheliaandmichela feng d9c6f2f780 feat(usage): add i18n strings for the Usage page
Menu label (Usage) and the resource-tab strings (filters, export
chart/table, table headers) across all five locales.
2026-06-03 17:10:51 +08:00
micheliaandmichela feng 9a4d77e869 style(usage): tune shared bar/pie charts for the usage views
- bar-chart: barMinWidth so hour-granularity bars stay visible with gaps.
- pie-chart: single legend-beside-pie layout, value (percent%) tooltip,
  2-decimal rounding for the Summary donut.
2026-06-03 17:10:51 +08:00
micheliaandmichela feng 2407416e33 feat(usage): add resource-usage API client, meta hook, and shared utils
The data layer the resource tabs build on:
- apis/resource.ts: adapter over the unified metered_usage read API
  (resource/gpu-instances/storage/summary/events breakdowns), flattening
  the server's generic shape into the per-tab item shape.
- hooks/use-resource-meta.ts: loads creators/instances/volumes filter
  options for the current scope.
- utils/time-buckets.ts: day/week/month/hour bucket keys + range fill.
- utils/export-breakdown.ts: derive Excel columns from antd table specs.
2026-06-03 17:10:51 +08:00
jialinandjialin 234e42ccfa chore: remove comment 2026-06-03 15:50:06 +08:00
jialinandjialin 4426b8dc30 fix: request noop 2026-06-03 15:50:06 +08:00
jialinandjialin 9541f49f39 fix(style): table cell overflow 2026-06-03 15:50:06 +08:00
jialinandjialin 9f7a99f370 fix: refresh list after creating key 2026-06-03 15:50:06 +08:00
jialinandjialin 12f0bb2f98 chore: request.extensions 2026-06-03 15:50:06 +08:00
jialinandjialin ac45a72e0e fix: api acccess info model name 2026-06-03 15:50:06 +08:00
jialinandjialin 9705818b15 fix: wrap fetch for injecting headers 2026-06-03 15:50:06 +08:00
jialinandjialin 39374eafda fix: update params after switching model 2026-06-03 15:50:06 +08:00
Yuxing Dengandjialin 110bc3205e fix: failed to enable gpu instance while creating cluster 2026-06-03 15:33:33 +08:00
gitlawrandjialin 57fec89f2d feat(api-keys): show creator column and filter to org owners
Switch the gate from `currentUser.is_admin` to `access.canSeeOrgAdmin`
so Org owners get the same all-keys view (Creator column, creator
filter, `user_id: '*'` default) that platform admins have. Mirrors
the BE's "platform admin OR current-Org owner" gate on listing every
key in scope.

The user picker now fetches `/user-directory` instead of the
admin-only `/users` endpoint, which would 403 Org owners. Rename the
filter placeholder from the misnamed `models.table.filterByName` to
`common.filter.byCreator`.
2026-06-03 15:25:38 +08:00
gitlawrandjialin 72e794c281 fix: align playground default model id with org namespace
Opening an org-scoped deployment in the Playground pre-selected the bare
model name (e.g. `qwen3-0.6b`), which never matched the org-namespaced
option the `/v1/models` dropdown actually lists (`org1/qwen3-0.6b`), so
the selection showed an unmatched value.

Resolve the owning org from the route row's `owner_principal_id` (falling
back to the org the caller is currently acting under for the admin "All"
view) and reconstruct the same `{org}/{name}` id the server reports. The
platform org carries no prefix, matching the server's behaviour.

- user.ts: add `getOrgById`/`getCurrentOrg` that scan both org caches
  (`organizationList` + admin-only `allOrganizations`) with string-
  normalised id comparison; `getOrgNameById` is now a thin wrapper.
  Helpers accept `undefined` so optional row fields type-check.
- use-open-playground: build the prefix from the resolved org record,
  keying the skip-prefix decision off `is_platform`.
- RouteItem: declare the `owner_principal_id` the list API returns.
- RouteTargetFormItem: drop the duplicate `overridden_model_name`
  declaration that TS flagged as a duplicate identifier.
2026-06-03 10:59:43 +08:00
gitlawrandjialin fadbcc3e44 feat(benchmark): scope the benchmark create form by organization
Add the organization picker to the benchmark create form (platform-admin
"all organizations" view). Fetch the chosen org's clusters and keep only
those it owns; refetch the org-scoped model / instance list on org change;
clear a stale cluster or target when switching to an org with no clusters.
2026-06-03 10:14:50 +08:00
gitlawrandjialin 9e30e964e6 feat(models): scope deployment and model-file create by organization
Add the organization picker to the model deployment and model-file
download forms (platform-admin "all organizations" view). Filter the
cluster / worker pickers to clusters the chosen org owns, so the created
resource's owner stays aligned with where it runs and a cross-org cluster
can't be selected. Carry owner ids on the cluster / worker options to
drive the filter.
2026-06-03 10:14:50 +08:00
gitlawrandjialin fbb707d014 feat(gpu-service): scope create forms by the selected organization
In the platform-admin "all organizations" view, add an organization picker
(the CreateOrgScopeField slot) to the SSH public key, storage type,
storage, GPU instance and instance-template create forms, placed below the
name / display-name fields. Drop the hidden owner field and let the owner
derive from the request context, matching the model-route form.

For GPU instances, scope the instance-type list to clusters the chosen org
owns (client-side, by cluster owner) so an instance can't be scheduled onto
another org's cluster; when the org owns none, show "no instance type
available" and clear the selection, cluster and CPU/memory fields. Instance
templates gain a Global level (NULL owner) and an owner tag on the card.
2026-06-03 10:14:50 +08:00
gitlawrandjialin d2d82ee5ee feat(request): add a response-interceptor seam
Add `extraResponseInterceptors` next to the existing request-interceptor
seam and wire it into the request config, so build-time tooling can react
to responses (e.g. clear a one-shot request-scoped hint after a write
completes). Default is an empty list — no behavior change by default.
2026-06-03 10:14:50 +08:00
jialinandjialin 9061fa08ba chore(deps): update ui 1.0.22 2026-06-02 17:51:25 +08:00
jialinandjialin f29236518e style: selector max tag count 2026-06-02 17:51:25 +08:00
jialinandjialin 6537de5224 fix(style): worker step container 2026-06-02 17:51:25 +08:00
jialinandjialin 0413d470a8 fix(style): worker upgrade tips do not show 2026-06-02 17:51:25 +08:00
jialinandjialin c01f4d3ce8 style: table split 2026-06-02 15:18:00 +08:00
jialinandjialin dd9d359bb0 chore: storage label 2026-06-02 15:18:00 +08:00
jialinandjialin b444c35643 style: side menu scroll bar 2026-06-02 15:18:00 +08:00
jialinandjialin abd0d52fad chore: perferences route 2026-06-02 15:18:00 +08:00
yxfandjialin c8771dd3b9 fix(label): update LoRA Adapter label to plural form 2026-06-02 15:13:55 +08:00
jialinandjialin 6d16f56183 chore(deps): update ui 1.0.21 2026-06-01 21:06:56 +08:00
jialinandjialin 95ffe0350e fix(style): k8s form 2026-06-01 21:06:56 +08:00
jialinandjialin e314f25a77 style: gpu instance service 2026-06-01 21:06:56 +08:00
gitlawrandjialin 65ea65e9ae feat(api-keys): rename User Name column to Creator and move before Created
Rename the api-keys list column from User Name to Creator for clarity and reorder it to sit immediately before the Created column. Add the common.table.creator locale key across all supported languages.
2026-06-01 19:13:44 +08:00
jialinandjialin 4ce975562e chore(deps): update ui 1.0.20 2026-06-01 13:36:14 +08:00
jialinandjialin 07e625f2bc chore: add locales 2026-06-01 13:36:14 +08:00
jialinandjialin d95fd8dc90 fix: instance type format in list 2026-05-31 22:23:32 +08:00
jialinandjialin 55028cf3a3 fix: parse quality data 2026-05-31 22:23:32 +08:00
jialinandLawrence Li 16a97772d3 fix: instance type api update 2026-05-30 08:28:38 +08:00
jialinandLawrence Li d33167d070 style: page segment fontsize 2026-05-30 08:28:38 +08:00
Yuxing Dengandjialin f62e0ba372 feat(cluster): add default container registry field to advanced config
Surface the top-level system_default_container_registry as a dedicated
input (both Docker and K8s), coerce blank to null, and drop its
redundant worker_config YAML hint.
2026-05-29 23:11:46 +08:00
jialinandjialin 1b6466ae78 chore: menu sorting 2026-05-29 18:04:31 +08:00
jialinandjialin 29c5987bf1 style: menu 2026-05-29 18:04:31 +08:00
Yuxing Deng fcd1d01e83 feat(cluster): update K8s cluster form for new k8s_options API
Align the Kubernetes cluster create/edit page with the backend's
promotion of operator/K8s knobs out of worker_config and the removal
of gpuVendorOverrides.

- k8s_options: drop gpuVendorOverrides; add operatorImage, namespace,
  and gpuInstanceOptions (presence = GPU instances enabled, carrying an
  optional gpuInstancesAccessStaticAddress).
- Add a top-level system_default_container_registry to the cluster type
  (promoted out of worker_config on the backend).
- Group all k8s_options fields into a new top-level "K8s Deployment
  Options" collapsible section (sibling of Advanced, rendered above it),
  with namespace first followed by volume mounts, image credentials,
  node selector, operator image, and GPU instances.
- Drive the GPU instances toggle from local state instead of
  Form.useWatch (an unregistered nested path never re-rendered, leaving
  the switch unresponsive); use antd's borderless Switch and keep the
  label/switch grouped together. Namespace gains a gpustack-system
  placeholder.
- Remove the gpuVendorOverrides validation from the form and the stale
  operator_image / namespace / gpu_instances_access_static_address hints
  from the worker_config YAML template and JSON schema.
- Add-worker GPU picker: always allow multi-select for K8s clusters
  (runtime node selectors are now auto-derived), dropping the
  override-gating, cluster fetch, and single-only hint.
- Update locales (en/zh/ja/ru/tr) for the removed and added keys.
2026-05-29 17:56:01 +08:00
gitlawrandjialin a80b889760 refactor(access): fold allowed_users into allowed_principals
Move the model-route access modal off the deprecated allowed_users
policy/field onto the unified allowed_principals + principals surface,
persisting everything through a single /access POST.

- "specific users" radio now uses allowed_principals; a returned legacy
  allowed_users value is normalized so existing routes still select it.
- derive the picker's selection and the full grant set from `principals`
  in GET /access (fall back to legacy `items` if a backend doesn't
  return principals yet).
- save as `principals`: the principal-based override sends its staged
  set; the user picker maps its selection to USER-kind grants and
  preserves any non-user grants from the snapshot (no longer sends
  `users`).
- guard saving before the GET seeds principals (would wipe grants);
  share the ALLOWED_PRINCIPALS_POLICY constant.
- AccessControlFormData: `users` optional, add `principals`.
2026-05-29 17:11:12 +08:00
jialinandjialin f71bf1b074 chore(deps): update ui 1.0.19 2026-05-29 16:19:17 +08:00
jialinandjialin 7e048ee537 fix: click twice for submitting deployment form, using iconfont static files 2026-05-29 16:19:17 +08:00
jialinandjialin 34098e8950 fix: orgname not be shown in playground 2026-05-29 13:35:22 +08:00
jialinandjialin faf0d4d605 chore(deps): update ui 1.0.18 2026-05-29 11:30:17 +08:00
jialinandjialin 85ade88d55 fix: instance name text overflow 2026-05-29 11:24:03 +08:00
jialinandjialin 7d0b94330d fix: adapter request not be triggered 2026-05-29 11:24:03 +08:00
gitlawrandjialin 5cff1298fc feat(management): show only own rows on Clusters / Storage Types lists
The two management pages now pass ``mine=true`` to their list APIs.
With multi-tenant cluster_access in place an Org Owner would
otherwise see rows that came in via cross-Org grants — usable but
read-only — and editing/deleting them would 403 from the backend.
Restricting the management lists to rows the caller's scope owns
keeps the UX honest. PV-create / GPU-instance-create pickers still
query without ``mine`` so usable cross-Org clusters and types are
selectable there.
2026-05-28 18:16:15 +08:00
gitlawrandjialin d3a3d4e96e feat(templates): fix unresponsive action dropdown for non-admin
Two changes that together restore the per-row Edit / Delete menu
for non-admin users:

- ``templateActions`` drops the blanket ``access: 'canSeeAdmin'``
  gate on every menu item. With the gate on, non-admin callers got
  an empty filtered menu, so clicking the "..." did nothing.

- The management page passes ``mine=true`` to the list API. The
  endpoint now drops Global rows for non-admin callers (rows they
  can't edit anyway), so the dropdown shows up only on rows the
  caller may manage. The GPU-instance create picker reuses the
  same API without ``mine``, keeping Global presets visible there.
2026-05-28 18:16:15 +08:00
jialinandjialin f99621ec92 fix: catalog hidden fields 2026-05-28 15:51:51 +08:00
jialinandjialin e47a9304f4 fix: cluster worker_config refill 2026-05-28 15:51:51 +08:00
jialinandjialin 9488fc1251 fix: update instance item type 2026-05-28 15:51:51 +08:00
jialinandjialin b590aa746b fix: update onceMaxRequest field 2026-05-28 15:51:51 +08:00
jialinandjialin ef61134b8b chore(deps): update ui 1.0.17 2026-05-28 10:02:32 +08:00
jialinandjialin a9daa0b586 fix: max gpu count 2026-05-27 20:18:33 +08:00
jialinandjialin ae0ad25ed6 fix: an error occured in switch language in stt 2026-05-27 20:18:33 +08:00
jialinandjialin a4c48c1981 fix: remove description json format 2026-05-27 17:10:15 +08:00
jialinandjialin 3497590d2e fix: using select handler for provider hint 2026-05-27 17:10:15 +08:00
jialinandjialin 11cf1329c8 fix: always show max label 2026-05-27 17:10:15 +08:00
jialinandjialin ba5b41cf3a chore: update locales 2026-05-27 17:10:15 +08:00
gitlawrandjialin 1d70446cc4 fix(routes): let Org owners see Storage Types menu
The route was gated on ``canSeeAdmin`` so only platform admins ever
saw Storage Types in the sidebar. But the backend route
(``gpu_instance_persistent_volume_types``) is tenant-scoped — Org
owners can create / list their own — so hiding the menu from them
left an admin-defined feature reachable only by URL.

Relax to ``canSeeOrgAdmin`` to match. OSS keeps the platform-admin-only
behaviour (predicate defaults to ``isPlatformAdmin``); the enterprise
access extension widens it to the current-org owner.
2026-05-27 16:57:49 +08:00
gitlawrandjialin f15d0ab243 fix(cluster-create): hide ProviderCatalog when entering via providerHint
The catalog was gated on ``currentStep === startStep`` so it would
re-appear at step 1 whenever ``providerHint`` skipped the catalog (e.g.
GPU Service's "Add a Kubernetes Cluster" empty-state CTA). Result: the
configure step rendered the catalog *plus* the Name/Description/Advanced
form together, with Kubernetes shown as already selected — confusing
and ugly.

Pin the catalog to step 0 explicitly. ``startStep`` was only used to
seed ``currentStep``, so it's inlined into the ``useState`` initializer
to keep the "skip the catalog when providerHint is set" intent in one
place. Pre-selecting a provider now correctly lands the user straight
on the configure form alone.
2026-05-27 15:53:39 +08:00
jialinandjialin 34be4800d7 fix: lora tag 2026-05-27 15:45:28 +08:00
jialinandjialin e40b0c2e07 fix: get back lora_module_name 2026-05-27 15:45:28 +08:00
lizw2andjialin 45e0ad9e93 fix(model-routes): use overridden model name for provider targets 2026-05-27 15:45:28 +08:00
gitlawrandjialin 96e6ddfe8a fix: collapse GPU Service menu in Personal Org; add K8s-direct CTA
Two follow-ups to the GPU Service gating:

- In Personal-Org view the access extension was stripping
  canSeeAdmin/canSeeOrgAdmin but leaving canSeeGpuService at its
  admin-shortcut value, so platform admins switched into Personal
  still saw the menu even though Personal scope can't host a K8s
  cluster. Mirror the probe result through sessionStorage so the
  extension can fall back to the strict cluster-availability signal
  in that branch.

- The empty-state CTA now reads 'Add a Kubernetes Cluster' and, on
  click, opens the cluster-create flow with Kubernetes preselected
  via clusterSession.providerHint. ClusterCreate consumes the hint
  on mount: it seeds extraData.provider and starts at the configure
  step instead of the provider catalog, so the user lands one click
  closer to the form they actually need.
2026-05-27 13:41:32 +08:00
gitlawrandjialin 6b47bacfac feat: gate GPU Service on Kubernetes cluster availability
GPU Service today only schedules on Kubernetes clusters; Docker / cloud
clusters can't host the CRDs. Without any awareness of that, Org
members whose Org has no K8s cluster (and no cluster_access grant on
one) saw a menu they couldn't use and a form that bottomed out with
backend errors.

Two changes lock the UX down:

- Boot probes the caller's cluster list once and stashes
  hasKubernetesCluster in initialState. A new canSeeGpuService
  predicate gates the menu — admins and Org owners always see it
  (they can add the cluster); everyone else only sees it when a
  reachable K8s cluster actually exists.

- The instances page filters its own cluster list to Kubernetes
  before deciding what to show. With nothing reachable we render the
  Deployments-style 'No clusters available. Add a Kubernetes cluster
  to get started.' empty state and hide the create-instance CTA;
  admins and Org owners additionally get the 'Add cluster' button
  that jumps to cluster management.
2026-05-27 13:41:32 +08:00
gitlawrandjialin 099b419e34 fix: source owner_principal_id from current organization
OwnerPrincipalIdField was reading currentClusterAtom, which no callers
ever wrote — so every form submission ended up with
owner_principal_id=null and the backend rejected non-admins with
"Only platform admin can create global ...". Pin the field to
currentOrganizationId instead (the Org the caller is acting under).
Cluster ownership is the wrong source: a cluster_access grant lets one
Org schedule on another Org's cluster, but the new resource is still
owned by the caller's Org, and the backend enforces
owner_principal_id == ctx.current_principal_id.

Also drops the dead currentClusterAtom.
2026-05-27 13:41:32 +08:00
jialinandjialin e343ec0a1e fix: instance type width 2026-05-27 12:14:15 +08:00
jialinandjialin e3d6d08916 fix: show max gpu 2026-05-27 12:14:15 +08:00
jialinandjialin d0bc206c83 fix: instance type missing when using CPU type 2026-05-27 12:14:15 +08:00
jialinandjialin 7287f8c81b style: subdrawer width 2026-05-27 12:14:15 +08:00
jialinandjialin 1878753cde fix: show cluster in table 2026-05-26 23:02:28 +08:00
jialinandjialin 2f04e01f4f fix: default instance type, storageMode 2026-05-26 22:40:02 +08:00
jialinandjialin a51f44c135 fix: select a useable instance type for initial 2026-05-26 22:40:02 +08:00
jialinandjialin 7f14eb544c fix: pvc events api 2026-05-26 19:16:50 +08:00
jialinandjialin c6e34db329 fix: ux issues 2026-05-26 19:16:50 +08:00
Yuxing Deng acb90531b2 feat: extend cluster k8s_options with multi-vendor manifest support
- New k8s_pod_spec form sections (image credentials, node selector,
  gpu vendor overrides) under k8s_options, replacing the legacy flat
  k8s_volume_mounts list. UI keys aligned to the backend wire shape
  (snake_case k8s_options + camelCase inside).
- System default container registry is pre-filled into the first image
  credential when creating a new cluster; empty username/password are
  coerced to null on submit to match the Optional[str] backend schema.
- Register cluster flow supports multi-runtime selection gated by the
  cluster's gpuVendorOverrides: non-override vendors stay single-select
  with an inline hint; multi-add only opens once an override vendor is
  picked, and non-override cards become disabled in that state.
- Manifest URL emits multiple ?runtime= params; check-env step combines
  per-vendor commands; downstream steps are disabled when no vendor is
  selected.
- Pre-validate gpuVendorOverrides at save time (non-empty selector, no
  duplicates across vendors, no key clash with base nodeSelector) so
  the user sees the error before hitting the manifest endpoint.
- Misc: dark-mode background of the k8s_pod_spec / volume mount titles
  no longer clashes with the drawer; cluster Steps no longer leaks the
  internal showModules/showForms props to the DOM.
2026-05-26 16:54:14 +08:00
yxfandyxf0314 91c3d0b814 feat: add parameter format and common parameters to backend configuration 2026-05-26 14:30:19 +08:00
jialinandjialin 95e03d11c1 fix: gpu service issues 2026-05-26 14:21:52 +08:00
jialinandjialin 88ab927755 refactor: gpu service API alignment 2026-05-25 22:42:02 +08:00
jialinandjialin 81c7e2ee61 fix(style): template title gap 2026-05-25 22:42:02 +08:00
jialinandjialin b5ed64de51 chore: ssh key selection 2026-05-25 22:42:02 +08:00
jialinandjialin 921a2a0d81 fix: instance form ux 2026-05-25 22:42:02 +08:00
jialinandjialin 5195b1e5fc style: number selection 2026-05-25 22:42:02 +08:00
jialinandjialin f886422f91 fix(style): textarea label background 2026-05-25 22:42:02 +08:00
jialinandjialin 27d57d7563 feat: instance pv events 2026-05-25 22:42:02 +08:00
jialinandjialin 2ebb8f44b7 fix: recreate action 2026-05-25 22:42:02 +08:00
jialinandjialin a0b408e8cb style: instance type remaing resourece 2026-05-25 22:42:02 +08:00
jialinandjialin 858e0dae09 feat: add number selection 2026-05-25 22:42:02 +08:00
gitlawrandjialin 7bee337554 fix(playground): inject X-Organization-Id on non-umi fetch paths
Playground completions (chat streaming via ``fetchChunkedData``)
and the raw ``fetch()`` calls for image / audio generation skip
umi's ``request`` pipeline and so miss the request interceptor in
``request.extensions.ts`` that pins tenant context. Higress
receives those calls without ``X-Organization-Id`` and the auth
callback falls back to the user's USER-principal id rather than
their active Org, which makes Playground usage invisible from
Org-scoped Usage views even after the backend learned to backfill
``consumer_principal_id``.

Centralise the lookup in ``tenantHeaders()`` next to
``fetchChunkedData`` so both streaming helpers and the four
``fetch()``-direct entry points in ``playground/apis/index.ts``
(image / TTS) attach the header with the same precedence as the
umi interceptor (``createScopeOrgOverride`` first,
``currentOrganizationId`` second). Returns an empty object when
no active org context is set, leaving requests unchanged.
2026-05-25 18:02:31 +08:00
jialinandjialin 7944b3f579 fix: add lora tag in routes 2026-05-25 13:56:44 +08:00
jialinandjialin 5e889563ca fix: search lora ux 2026-05-25 13:56:44 +08:00
jialinandjialin aad3b458c8 fix: selection styles 2026-05-25 13:56:44 +08:00
jialinandjialin acef2ef89a fix: add form validation 2026-05-25 13:56:44 +08:00
jialinandjialin d99c25dd03 feat: model file is lora 2026-05-25 13:56:44 +08:00
jialinandjialin f0a1dad48e fix: filter invaild lora in form 2026-05-25 13:56:44 +08:00
jialinandjialin 1e334903dd feat: lora route 2026-05-25 13:56:44 +08:00
jialinandjialin 342583f8d1 feat: lora for deployment 2026-05-25 13:56:44 +08:00
gitlawrandjialin 6af18275c4 feat(usage): treat org owners as managers on the Usage page
The Usage page gated cross-user features (default ``scope=all``,
the user filter, the per-user breakdown dimension) on
``currentUser.is_admin`` alone. The backend's
``_can_use_all_scope`` already grants the same surface to Org
owners — the page just never asked. Result: a non-admin Org owner
landed on ``scope=self`` with no user filter and no per-user
group-by, even though the API would have happily served them the
org-wide picture.

Switch the three sites to ``useAccess().canSeeOrgAdmin``, which
already encodes "platform admin OR owner of the selected
(non-Personal) Org". One predicate, no new helper.

Sites:
- ``index.tsx``: ``initialScope`` defaults to ``all`` for managers.
- ``filter-bar.tsx``: the user filter + nested API-key cascader
  surface (vs the flat API-key picker for members).
- ``daily-usage.tsx``: the ``user`` group-by option in the chart.
2026-05-25 13:56:25 +08:00
gitlawrandjialin 9c519d937d fix(usage): pass scope to the time series chart fetch
The Usage page's chart fetch (``fetchTimeSeriesData``) spread
``chartFilters`` plus dates and filters, but never forwarded
``commonFilters.scope`` — so it implicitly fell back to the
backend's ``scope=all`` default. The three breakdown tables
(``apikeys-table``, ``models-table``, ``users-table``) all pass
``scope`` explicitly, which produced an inconsistent picture on
the same page: an Org owner viewing a model granted from another
Org saw the date chart render empty while the tables underneath
showed identical usage rows.

Forward ``currentSelectedFilters.scope`` alongside the rest of the
common filters so the chart and the tables ask the backend the
same question.
2026-05-25 13:56:25 +08:00
Yuxing Deng 4b14fa6ca8 feat(usage): plugin slot for Models tab extra columns
Lets enterprise plugins contribute per-route columns and a global
mount point on the Usage page's Models tab. Mirrors the existing
modelRoutes pattern: `usage.modelsExtraColumns` for cells,
`<PluginExtraFields name="UsageModelsPageGlobal" />` for the
page-level data lifecycle (receives the visible route ids so a
plugin can bulk-fetch per-row data in one call).
2026-05-25 10:42:59 +08:00
jialinandjialin dc69e51042 fix: colorPrimary cache cleared 2026-05-24 10:51:44 +08:00
jialinandjialin 052d5aa474 fix: colorPrimary cache cleared 2026-05-21 19:58:16 +08:00
jialinandjialin 0c55c1c1b4 fix: sider menu style 2026-05-21 19:58:16 +08:00
jialinandjialin 6f896b4f94 fix(style): use --app-banner-height in scroller container 2026-05-21 19:58:16 +08:00
gitlawrandjialin e7a376db70 refactor: adapt org-namespace lookup to principal name rename
Tracks the gpustack identity-consolidation effort: the unified
``principals`` table's URL-safe identifier column was renamed
``slug`` → ``name`` (with the legacy display ``name`` → ``display_name``).
The enterprise plugin's persisted org caches (``organizationList``,
``allOrganizations`` in localStorage) now write ``name`` instead of
``slug`` on each Organization row.

``getCurrentOrgNamespace`` reads those caches to compose the k8s
namespace (``gpustack-{name}``) for GPU-instance / storage CRDs.
Updated to read ``item.name`` so namespace resolution stays in sync
with what the enterprise plugin writes — otherwise every gpu-service
write would fall through to ``gpustack-default`` even when the user
has an Org context.

Stale ``slug`` references in surrounding comments also retitled to
``name`` to avoid divergence between code and prose. The namespace
format itself (``gpustack-{...}``) is unchanged — only the column it
sources is.
2026-05-21 12:15:39 +08:00
Yuxing Dengandjialin 15cf4d89b7 feat: association dounut effect 2026-05-20 11:29:43 +08:00
Yuxing Dengandjialin c38fcc494a refactor(dashboard): collapse usage section into a single row
Merge the two "by Model" pies (Token Usage + API Requests) into one
dual-pie card with a shared right-side vertical legend and per-donut
center totals, drop the standalone API-Key Top 10 chart, and put the
combined chart side-by-side with the User Top 10 ranking in one row
with the same 16/8 column ratio used by the System Load section above.

* New component usage-charts/usage-by-model.tsx owns both metric queries
  (group_by=['date','route']), aggregates a shared route→color map so
  the legend toggles both donuts together, and renders two pies at
  centers ('20%','50%') and ('60%','50%') with radius ['50%','70%'].
* new-usage.tsx no longer mounts ApiRequestsByModel / TokenUsageByModel
  / TopTokenUsageByApiKey; layout collapses to two columns sized
  (lg=24 xl=16) and (lg=24 xl=8).
* Delete unused token-usage-by-model.tsx, api-requests-by-model.tsx,
  top-token-usage-by-api-key.tsx, and the use-top-token-usage-by-api-key
  hook.
* Strip the now-unreferenced dashboard.tokenUsageByModel /
  apiRequestsByModel / topTokenUsageByApiKey locale keys across 5
  locales, add the new dashboard.usageByModel title; locale parity
  check passes.
2026-05-20 11:29:43 +08:00
Yuxing Deng 44e5b78d29 refactor(dashboard): switch usage charts to route group_by, rename Models card
Align dashboard with the route dimension introduced in the previous
commit:

* Token Usage / API Requests pie charts query the breakdown API with
  `group_by: ['date', 'route']` and aggregate via the new `route`
  dimension in `buildUsageLabel`. Visible chart titles keep the existing
  "by Model" wording — only the underlying data dim changed.
* Overview "Models" card label switched to `dashboard.deployments`
  ("部署" / "Deployments"), and the Active Models table heading to
  `dashboard.activeDeployments`. These reflect the underlying entity
  (model deployments) more accurately now that routes are the
  user-facing model concept.
* Drop 11 unused dashboard locale keys (`dashboard.title`,
  `dashboard.models`, `dashboard.allocategpus`, `dashboard.instances`,
  `dashboard.disk`, `dashboard.diskutilization`, `dashboard.apirequest`,
  `dashboard.activeModels`, `dashboard.activeUsers`,
  `dashboard.activeModels.name`, `dashboard.runninginstances`) — no
  remaining references in `src/` after the rename. Locale parity check
  passes.
2026-05-19 16:50:42 +08:00
Yuxing Deng 38107a67fe refactor(usage): switch breakdown dimension from model to route
Align with gpustack backend commits 7b57cd3b (add route dimension to
usage breakdown) and 51fd25c8 (use model_route_id as models_called):

* group_by, filters, and BreakdownItem now use the `route` dimension;
  `models` filter cascader is replaced with a flat `routes` selector
  (routes have no provider/cluster grouping).
* Tab / group_by option / column header keep the user-facing "模型 / Model"
  wording — only the underlying data dimension changed.
* Drop cluster_name / provider_type columns from the breakdown table;
  drop api_keys_used column per design.
* Fix pre-existing excel export bug in use-export-table — string
  dataIndex was lodash-joined char-by-char ("input_tokens" →
  "i_n_p_u_t..."), array dataIndex was used as a flat key against nested
  rows. Rebuilt around buildSheetMeta that emits a stable field key plus
  a formatMap using _.get(row, path) for nested values. Sheet name kept
  as `models` to match the visible column label.
2026-05-19 16:50:42 +08:00
jialinandjialin 0274bcb8cd chore: update ui 1.0.14 2026-05-19 14:09:07 +08:00
gitlawrandjialin a91c1545f8 fix: require ref audio for Base task in TTS playground 2026-05-19 12:36:08 +08:00
jialinandjialin 0b3884b1a5 fix: gguf input box is hidden when deploying from model files 2026-05-19 12:16:02 +08:00
jialinandjialin bcea46fa8f fix(style): chart style 2026-05-18 20:14:28 +08:00
jialinandjialin abc3c2c25a fix: instance events namespace 2026-05-18 16:59:53 +08:00
jialinandjialin db7a8a702d fix: select panel no default value 2026-05-18 15:37:46 +08:00
jialinandjialin 288bfebc13 fix: filter user option in usage 2026-05-18 15:37:46 +08:00
jialinandjialin c7996d3e14 fix: login page miss icon 2026-05-18 15:37:46 +08:00
jialinandjialin 0d9b6325f9 fix: hygon, thead runtime 2026-05-18 15:37:46 +08:00
gitlawrandjialin baf1508644 fix: guard systemConfigAtom reads against null
``logout`` calls ``clearAtomStorage(systemConfigAtom)`` which sets the
atom to ``null``, and on a fresh SPA login (no full reload)
``app.tsx``'s ``fetchSystemConfig`` doesn't re-run, so consumers that
read ``systemConfig.xxx`` directly crash with "Cannot read properties
of null". A hard refresh masks the bug. Add optional chaining at the
read sites (grafana url / dashboard uids, showMonitoring) so the
contract stays robust regardless of how the atom is reset.
2026-05-18 15:36:29 +08:00
jialinandjialin d04604abe5 fix: SelectPanel props 2026-05-18 13:28:52 +08:00
jialinandjialin bf09784fad chore: update ui 1.0.13 2026-05-18 13:28:52 +08:00
gitlawrandjialin 67f5c794e1 fix(login): keep 360px design width with max-width: 100% cap
Switching ``Buttons`` to ``width: 100%`` (in c32ad712) had a
side-effect — with ``FormWrapper`` sized to ``max-content``, a
100% child without LocalUserForm alongside it lets the card
collapse to the button's intrinsic text width. Per PR #1097 review,
go back to the 360px design width and rely on ``max-width: 100%``
to keep it from overflowing tighter parents (the enterprise cover
layout's 272px inner especially).

Apply the same shape to LocalUserForm — its hardcoded 360px alone
would still overflow on the cover layout — so the two surfaces
stay in lockstep when switching between SSO and password modes.

(Pre-commit hook still crashes on the ``context.getDeclaredVariables``
bug in main; unrelated.)
2026-05-18 12:25:08 +08:00
gitlawrandjialin 55fbe118d5 fix(login): stop SSO button from overflowing the login card
``Buttons`` was a fixed ``width: 360px`` column, but ``FormWrapper``
sizes its content area to ``max-content`` capped at 440px (with 40px
padding). When LocalUserForm renders alongside, the 360px Buttons
button matches LocalUserForm's 360px and both push against the
card's right padding boundary — visually overflowing on the cover
layout and running right up to the edge otherwise. Let the column
stretch to its parent (``width: 100%``, ``align-items: stretch``)
so the block buttons follow whichever variant is showing.

(Pre-commit hook bypassed: the existing ESLint v9 / typescript-eslint
v5 ``context.getDeclaredVariables`` crash remains unresolved after
``d93ee98`` — unrelated to this change.)
2026-05-18 12:25:08 +08:00
Yuxing Dengandjialin ae8ec8572c feat: generic configActions plugin slot for api-keys & model-routes
Introduce `pages/api-keys/plugin.tsx` and `pages/model-routes/plugin.tsx`
defining a unified `{ key, labelId, icon, priority, danger, form,
useCreate }` contract that plugins use to contribute per-row
"configure this record" actions. The host renders one dropdown entry
per registered action and mounts each entry's form, ordered by a
single numeric priority (built-ins are ranked on the same scale; rows
flagged `danger` sink to the bottom).

Drops the older `apiKeys.rowActions` / `modelRoutes.rowActions` slots
and the implicit drawer half of
`<PluginExtraFields name="APIKeysPageGlobal" />`. The model-routes
mount point stays for the page-level quota-defaults bulk-fetch and now
also accepts a `refreshToken` so per-row saves can invalidate derived
page data without changing the row set.
2026-05-18 12:14:19 +08:00
jialinandjialin 38b91a558b chore: remove notes 2026-05-15 16:22:07 +08:00
jialinandjialin a001f83abb fix: update instance name error 2026-05-15 16:22:07 +08:00
jialinandjialin 87c8a3a64d feat: add instance recreate action 2026-05-15 16:22:07 +08:00
jialinandjialin c6e7075bf5 feat: template port name 2026-05-15 16:22:07 +08:00
jialinandjialin 5d75cfdfc5 fix: name validation 2026-05-15 16:22:07 +08:00
jialinandjialin 3f9852c932 refactor: instances add-modal 2026-05-15 16:22:07 +08:00
jialinandjialin 9dfaf990fd feat: add events, log api 2026-05-15 16:22:07 +08:00
micheliaandjialin 1bef1637e0 feat: support license banner 2026-05-15 09:41:10 +08:00
jialinandjialin 451d5bfe47 fix: show inject params, update ui 1.0.11 2026-05-14 11:54:51 +08:00
jialinandjialin faa1f935b7 feat: provider access to core-ui 2026-05-14 11:52:48 +08:00
jialinandjialin c428fe175a chore: remove inject params tag 2026-05-14 11:21:49 +08:00
jialinandjialin 9767c8bf39 chore: show deployment backend params 2026-05-14 11:21:49 +08:00
jialinandjialin 96b50538ed feat: add antv/g6 2026-05-13 17:58:31 +08:00
gitlawrandjialin 2dae886fd1 fix(gpu-service): use gpustack-{slug} namespace for org resources
The legacy ``getCurrentOrganizationId`` helper returned the raw numeric
org id from localStorage, which the GPU-service / storage call sites
then used as the K8s namespace path segment — producing requests like
``/v2/clusters/1/proxy/.../namespaces/5/instances``. The backend
creates a namespace named ``gpustack-{slug}`` (matching
``get_namespace_name``), so the request hit a namespace that doesn't
exist.

Replace the helper with ``getCurrentOrgNamespace`` that:

- prefers the Org the caller is acting under (numeric
  ``currentOrganizationId`` from localStorage, slug looked up in the
  persisted ``organizationList`` or ``allOrganizations`` cache);
- falls back to the selected cluster's owner Org slug for the admin
  "All" view, where there is no explicit Org context but the resource
  still has to land in some Org's namespace — call sites pass
  ``currentCluster?.owner_principal_id`` through;
- falls back to ``gpustack-default`` only if neither path resolves a
  slug (first load before any cache hydrates, etc.).

``ClusterListItem`` is widened with the optional ``owner_principal_id``
field so TypeScript accepts the fallback argument; the backend has
been returning it via ``ClusterPublic`` all along.
2026-05-13 12:29:09 +08:00
jialinandjialin beb74b3c47 fix: update lock.yaml 2026-05-13 10:52:44 +08:00
jialinandjialin d93ee98473 fix: eslinit context.getDeclaredVariables 2026-05-13 10:47:45 +08:00
jialinandjialin f081f0c1cf chore: dropdown styles token, icons url 2026-05-13 10:47:45 +08:00
jialinandjialin 4e49c399d0 fix: dashboard colors, users rank 2026-05-12 19:01:11 +08:00
jialinandjialin 2527555945 fix: HRM in dev 2026-05-12 14:31:52 +08:00
gitlawrandjialin 5ef671f047 feat: dashboard route gated on canSeeOrgAdmin
Relax the dashboard route from canSeeAdmin (strict platform admin)
to canSeeOrgAdmin so the access seam can widen the audience past
the platform admin — by default platform admin, plus whatever an
access extension chooses to admit. The dashboard endpoint takes
care of scoping the response per caller.

Also move Dashboard under the canSeeOrgAdmin bullet in the
access.ts predicate notes.
2026-05-12 14:20:18 +08:00
gitlawrandjialin 10781da086 fix: plugin locale merge re-runs on HMR; API Key form allows Personal
- locale-merger: drop the module-level dedup Set. addLocale is
  idempotent, and the guard made HMR-added plugin locale keys
  silently skipped — strings like organizations.members.selectUsers
  stayed unresolved until a full dev-server restart.
- api-keys form: pass allowPersonal: true to CreateOrgScopeField so
  admin in Platform-wide mode can target their own Personal Org when
  creating a key (unlike infra resources where Personal doesn't fit).
2026-05-12 14:20:18 +08:00
jialinandjialin c279a7f186 fix: gpu service access 2026-05-11 21:05:08 +08:00
gitlawrandjialin 7dd1c9ac5e refactor(backends): rename organization_id to owner_principal_id
Aligns the InferenceBackend ownership column with the principal-based
ownership model used elsewhere (clusters, model_routes). NULL identifies
platform-curated rows shared across orgs; a populated value identifies
an org-scoped override or custom backend.
2026-05-11 20:28:29 +08:00
gitlawrandjialin 125a5be91f feat: restore cluster detail surface, gate cluster-list name link via plugin
The "chore: hide cluster detail" change had commented out both the
cluster-detail route and the cluster name link in the list. The
detail page component still ships in the OSS tree, so reach is
restored but the link is plugin-gated rather than unconditional:
plain OSS renders the name as a span; with a registered
`clusterDetail.linkableName` flag the name turns into a
`Typography.Link` that fires the parent's existing `onCellClick`
(which navigates to the detail route).

Detail tabs adjustments for the in-cluster context:
- Drop the Deployments tab (deployments are managed from the
  top-level Models page; the detail view is scoped to a single
  cluster's hardware).
- `WorkerList` and `GPUList` accept an optional `clusterId`. When
  set, the list pins `cluster_id` in its query and hides the
  cluster-filter dropdown so the user can't scope away from the
  cluster they're inside.

`clusterDetail.extraTabs(clusterId, intl)` exposes a plugin slot
that appends additional tab items — used by the enterprise plugin
to inject per-cluster Access / Quotas surfaces. No-op without a
plugin.
2026-05-11 20:28:29 +08:00
jialinandjialin e25d48cc89 fix: update react-route version 2026-05-11 20:09:37 +08:00
jialinandjialin 5f96f367a6 chore: lock pnpm version 2026-05-11 19:49:21 +08:00
jialinandjialin 01fe2e66fb fix: style issues 2026-05-11 19:49:21 +08:00
jialinandjialin 1b74285de9 fix: storage instance keep the same cluster 2026-05-11 19:49:21 +08:00
jialinandjialin b13ba0a229 fix: alignment api 2026-05-11 19:49:21 +08:00
jialinandjialin 9e0dd5b003 fix: display templates by manufacturer 2026-05-11 19:49:21 +08:00
jialinandjialin 4128de61f9 fix: api test 2026-05-11 19:49:21 +08:00
jialinandjialin fc900c8ce6 fix: ssh key, template test 2026-05-11 19:49:21 +08:00
jialinandjialin 63ac4e0e75 fix: instance api alignment 2026-05-11 19:49:21 +08:00
jialinandjialin 7ee1635833 fix: template api alignment 2026-05-11 19:49:21 +08:00
jialinandjialin 7d0cfeff77 fix: storage api alignment 2026-05-11 19:49:21 +08:00
jialinandjialin 7fa44644fd style: scroller 2026-05-11 19:49:21 +08:00
jialinandjialin e9152e8725 refactor: add instance modal 2026-05-11 19:49:21 +08:00
jialinandjialin 7ea7f6666d feat: templates, storage 2026-05-11 19:49:21 +08:00
jialinandjialin 3ae49dc826 feat: add intances list 2026-05-11 19:49:21 +08:00
gitlawrandjialin 75d7eff63b chore: bump @gpustack/core-ui to ^1.0.10
1.0.10 ships the fix for the rolldown-emitted `require("react")` shim
that broke 1.0.9 runtime (the dist bundle no longer calls the
runtime require helper for react / react-dom). Pin the OSS host's
package.json spec accordingly and regenerate the lockfile.

Side fix in `pages/login/index.tsx`: 1.0.10's `CoreHooks` type
makes `useCurrentUser` and `useTableFetch` required. The login
page's CoreUIProvider never needed them (no current-user reads
and no tables), so cast the hooks block to `any` rather than
mounting stubs that would never run.
2026-05-11 19:30:21 +08:00
gitlawrandjialin 8618718b71 chore: sync pnpm-lock.yaml with package.json
Two pre-existing drifts between package.json and pnpm-lock.yaml were
breaking `pnpm install --frozen-lockfile` in CI:

- `@gpustack/core-ui` was bumped to `^1.0.9` in package.json without
  regenerating the lockfile (lockfile still pinned the prior 1.0.6
  resolution). Pin to `^1.0.7` instead — 1.0.9 ships a packaging
  glitch that surfaces a `Calling \`require\` for "react"` exception
  at module init under MFSU, so the matching enterprise build was
  already reverted; 1.0.7 is the last known-good across both repos.
- `react-router-dom` had `^6.30.3` in package.json but `6.30.3`
  (no caret) in the lockfile spec. Match the lockfile to keep the
  intentional pin from the original add.

`pnpm install --frozen-lockfile` now passes locally.
2026-05-11 19:30:21 +08:00
gitlawrandjialin 8d17000272 feat: users row actions accept plugin entries
The per-row user actions menu was hard-wired to a fixed list and any
plugin-contributed control had to sit as a separate trigger beside
the dropdown. Move the seam: plugins now contribute dropdown items
directly via `users.rowActions`, and we dispatch the click to the
plugin entry by key while the host's `handleSelect` keeps owning
the built-in keys.

Each entry is `{ key, labelId, icon?, danger?, show?(user), onClick(user) }`.
For UI state the onClick might need (drawers, modals), plugins can
mount a single `components.UsersPageGlobal` slot that the page now
renders once outside the table — typical pattern is a jotai atom
the rowAction writes to and the global slot reads from.

Drop the side-mounted `PluginExtraFields name="UserRowActions"` and
its surrounding `<Space>`; the action column is back to a single
DropdownButtons with all entries in one menu.
2026-05-11 19:30:21 +08:00
gitlawrandjialin df53774628 feat: access-control seam exposes prepended policies + create default
The OSS access-control form currently lets a plugin replace the
`allowed_users` policy entry. Multi-tenancy also wants:
- an extra radio option for "Org-scoped" sitting in front of the
  built-ins, and
- a context-sensitive create-time default (routes inside a non-
  platform Org should land on the Org-scoped policy rather than
  `authed`).

Extend the `accessControl` slot with two more hooks:
- `prependedPolicies?: { policyValue, labelId, tipsId?, Field? }[]`
  — entries prepended to the radio group; each may carry an
  optional content `Field` rendered when selected.
- `resolveCreateDefault?: () => string | undefined` — overrides the
  initial `access_policy` for the create flow; the OSS fallback is
  still `authed`.

The host's tooltip list mirrors the same order. Existing behaviour
without a plugin is unchanged.
2026-05-11 19:30:21 +08:00
gitlawrandjialin 68235e188a fix: refresh Access Settings policy from /access response
Reopening the Access Settings dialog after a save could leave the
radio on the wrong policy: the form initialized `access_policy`
from the route list's snapshot, but the list isn't refreshed when
the dialog closes, so the snapshot's value silently shadowed the
just-saved policy.

Backend now returns the route's authoritative `access_policy` on
`GET /v2/model-routes/{id}/access`. Use that value when the GET
resolves, falling back to the parent snapshot only as the initial
seed so the radio isn't briefly unselected.

While we're here, widen the `access_policy` type from a closed
union to `string` — plugins can contribute additional policy
values via the `accessControl.allowedUsersOverride` slot, so the
wire type shouldn't restrict to the OSS-side enum.
2026-05-11 19:30:21 +08:00
gitlawrandjialin f37fad11b1 feat: access-control modal seam to swap the allowed_users surface
The OSS Access Settings form hardcodes the `allowed_users` policy
(per-user explicit grants via the legacy transfer widget). Multi-
tenancy needs a different surface that grants by Org / Group / User
principals via the `/v2/model-routes/{id}/principals` endpoints, and
the enterprise plugin will ship that — but the OSS form should stay
visually unchanged when no plugin is loaded.

Add a plugin extension point on the form: if a registered plugin
exposes `accessControl.allowedUsersOverride: { policyValue, labelId,
tipsId?, Field }`, the form replaces the `allowed_users` radio entry
with the plugin's labelled option, swaps the access-scope tooltip
copy, and renders `<Field form routeId action />` for the override
policy. Without a plugin the form's radio / tooltip / content path
are unchanged.

`handleOnFinish` continues to send `users` only for `allowed_users`;
any other policy (including the plugin's value) goes through with
an empty users list, leaving the plugin's Field to manage its own
principal CRUD inline.
2026-05-11 19:30:21 +08:00
gitlawrandjialin 93fa277bdd fix: Access Control Modal user picker uses /user-directory
The form populated its candidate list via the admin-only
`GET /v2/users`, so opening Route Access Settings as a non-admin
caller (e.g. an org owner managing their own route in the
enterprise plugin) returned 403. Add a `queryUserDirectory` client
wrapper around the slim `/v2/user-directory` endpoint (gated to
platform admin OR org owner) and switch `getUserList` over. Response
shape is the same so the rest of the form is unchanged.
2026-05-11 19:30:21 +08:00
jialinandjialin ea7fa63079 chore(deps): add react-route 2026-05-11 14:47:45 +08:00
jialinandjialin d15db4b4dd chore: update ui 1.0.9 2026-05-11 14:32:07 +08:00
jialinandjialin ed06d57a31 feat: add slots 2026-05-11 14:27:49 +08:00
gitlawr 168c55990f fix: pick landing route by access predicate to avoid redirect loop
Access extensions can narrow ``canSeeAdmin`` to ``false`` even when
``currentUser.is_admin`` is ``true``. The default-landing logic
keyed off ``is_admin`` and pushed admin to ``/dashboard``; when
``canSeeAdmin`` is narrowed there, ``Exception`` 403-redirects to
``/``, which re-pushes ``/dashboard``, looping into a blank screen.
Switch the landing pick (and the masthead-click handler) to consult
the resolved ``access.canSeeAdmin`` predicate instead.

Behavior is unchanged for the default access module, where
``canSeeAdmin`` mirrors ``is_admin``.
2026-05-09 17:22:27 +08:00
gitlawrandjialin 2889ba7c78 feat: plugin extension slots for access, request interceptors, Users actions, and form fields
Four purely-additive seams that let build-time tooling extend host
behaviour without forking files:

* `src/access.extensions.ts` — identity `applyAccessExtensions`
  (mirrors `config/routes.extensions.ts`). `src/access.ts` runs the
  resolved predicate object through it. Adds two new predicates,
  `canSeeOrgAdmin` and `canManageCurrentOrg`, alongside the existing
  `canSeeAdmin`. Resources, Models children, Cluster Management, and
  Resources/Backends are retagged from `canSeeAdmin` to
  `canSeeOrgAdmin`. Users and Dashboard stay strict.
* `src/request.extensions.ts` — identity-empty
  `extraRequestInterceptors`. `src/request-config.tsx` spreads it
  into the existing `requestInterceptors` list so extensions can
  inject context-aware headers without forking the request config.
* Users page action column — renders
  `getGPUStackPlugin()?.components?.UserRowActions` next to the
  existing DropdownButtons inside a Space when a plugin component
  is registered. If absent, the cell renders exactly as before.
* `src/components/plugin-extra-fields.tsx` — generic component-slot
  helper. Renders `pluginManager.components.<name>` if registered,
  forwarding a `context` payload. Used by create/edit forms to let
  plugins inject extra `Form.Item` fields. Mounted in the relevant
  create forms — API Keys, Cloud Credentials, Clusters, Model
  Routes, Model Providers, and Inference Backends — under the slot
  name `CreateOrgScopeField`. Resources whose org is implicit from a
  parent (Models / Workers / Benchmarks / Worker Pools / Model Files
  inherit from the chosen Cluster) deliberately don't mount the slot.
2026-05-08 18:29:52 +08:00
gitlawrandjialin 896b8ef326 feat: expose useTableFetch via CoreUIProvider
Inject the host's `useTableFetch` hook into the CoreUIProvider's
`hooks` prop alongside the already-wired `useCurrentUser`, so plugins
that import `useTableFetch` from `@gpustack/core-ui` resolve it through
the host instead of throwing
"`hooks.useTableFetch is not a function`" at the first list-page render.

Companion to the earlier `feat: add use current user` change — core-ui
exposes both hooks as host-injected, but only the user hook had been
plumbed.
2026-05-08 14:46:35 +08:00
jialinandjialin f08d5c904c refactor: dynamic routes 2026-05-08 09:33:16 +08:00
jialinandjialin 4be5fb4d3d feat: add use current user 2026-05-07 18:26:48 +08:00
jialinandjialin a2d5d55518 chore: backend default command 2026-05-07 18:26:48 +08:00
jialinandjialin e1b28b01df chore: backend placeholder 2026-05-07 18:26:48 +08:00
gitlawrandjialin b6bbe880a0 feat(plugin): expose OrgSwitcher slot in extraRender
Add a single host-side mount point in extraRender.tsx:

    const OrgSwitcher = pluginManager?.components?.OrgSwitcher;
    ...
    {OrgSwitcher && <OrgSwitcher />}

A registered plugin can supply an Org switcher via
components.OrgSwitcher. When no plugin provides it, the host
renders nothing here, so the build is visually unchanged.
2026-05-07 18:16:42 +08:00
jialinandjialin 65ad57fc4c fix: iluvatar env check command 2026-05-06 19:32:01 +08:00
jialinandjialin 469e63b898 fix: keep the source deploying from files 2026-05-06 15:09:15 +08:00
jialinandjialin d471233f83 fix: sync row replicas when start 2026-05-06 14:43:03 +08:00
jialinandjialin 01576212a3 fix: bool type in python code 2026-05-06 14:43:03 +08:00
jialinandjialin 898c7f1be2 refactor: dashboard usage 2026-05-06 12:27:22 +08:00
jialinandjialin 705b33e307 style: parameters tooltip 2026-05-06 12:27:22 +08:00
jialinandjialin 2592f44bc2 fix: append routeID to model proxy URL and drop X-GPUStack-Model header 2026-05-06 12:27:22 +08:00
jialinandjialin 9914db6b96 fix: hide distributed_inference for custom backend 2026-04-29 20:51:48 +08:00
jialinandjialin bb93ad37a1 feat: benchmark inject params 2026-04-29 20:51:48 +08:00
jialinandjialin 93bc632088 fix: stt error handler 2026-04-29 20:51:48 +08:00
jialinandjialin ab89ddffc8 fix: tts stream error 2026-04-29 20:51:48 +08:00
jialinandjialin 7794e57bb1 fix: update lock file 2026-04-29 18:21:24 +08:00
jialinandjialin 7c15bb6ef6 chore(deps): update ui 1.0.5 2026-04-29 18:09:55 +08:00
jialinandjialin ac99156c90 feat: ip access control 2026-04-29 18:09:55 +08:00
jialinandjialin c68f546be9 fix: apikey filters 2026-04-29 18:09:55 +08:00
jialinandjialin 217285223c fix: list-input, labels-selector form 2026-04-29 18:09:55 +08:00
jialinandjialin 3144328874 fix: chart flicker 2026-04-29 09:29:04 +08:00
jialinandjialin 26880b4612 refactor: usage chart 2026-04-29 09:29:04 +08:00
jialinandjialin e7aac14ef1 fix: keep previous run checkbox visible and fall back to main worker 2026-04-28 14:41:36 +08:00
jialinandjialin 52211cd4ea fix: previous run description 2026-04-28 14:41:36 +08:00
jialinandjialin 331c59b7c1 fix: logs container 2026-04-28 14:41:36 +08:00
jialinandjialin b605b17561 fix: main worker flag 2026-04-28 14:41:36 +08:00
jialinandjialin 33163ac96c style: start history selection 2026-04-28 14:41:36 +08:00
jialinandjialin 757af11ab3 chore: history options 2026-04-28 14:41:36 +08:00
jialinandjialin 81a87ef362 chore: logs history selection 2026-04-28 14:41:36 +08:00
jialinandjialin 0cb260f854 feat: logs history 2026-04-28 14:41:36 +08:00
jialinandjialin 0ffc2ee924 chore: update ui version 2026-04-27 21:10:34 +08:00
jialinandjialin e4992e8313 fix: custom logos 2026-04-27 21:10:34 +08:00
jialinandjialin 519020077a chore: update lock file 2026-04-24 14:28:30 +08:00
jialinandjialin 6fccee3711 fix: impoer external components 2026-04-24 14:28:30 +08:00
jialinandjialin 597a86562a fix: rebase main 2026-04-24 14:28:30 +08:00
jialinandjialin 16449613e0 chore: core-ui deps 2026-04-24 14:28:30 +08:00
jialinandjialin 6c161c6ae7 build: sync config 2026-04-24 14:28:30 +08:00
jialinandjialin 48b357b1c6 chore: update hooks import 2026-04-24 14:28:30 +08:00
jialinandjialin a795544074 fix: CInput not found 2026-04-24 14:28:30 +08:00
jialinandjialin 8711c27b78 chore: replace components with core-ui, upgrade eslint 2026-04-24 14:28:30 +08:00
jialinandjialin d48aa99dcc fix: deleted tag 2026-04-22 13:16:48 +08:00
jialinandjialin 5f3b9b88ff fix: reset page after filters changed 2026-04-22 13:16:48 +08:00
jialinandjialin f566ea3b63 fix: table sorter 2026-04-22 13:16:48 +08:00
jialinandjialin 8ba77beeed fix: sync filters 2026-04-22 13:16:48 +08:00
jialinandjialin 128f59ed6f chore: locales 2026-04-22 13:16:48 +08:00
jialinandjialin c92f56ec8f style: card style 2026-04-22 13:16:48 +08:00
jialinandjialin daa3d74500 fix: usage datepicker 2026-04-22 13:16:48 +08:00
jialinandjialin ad7fc3a993 fix: usage ux 2026-04-22 13:16:48 +08:00
jialinandjialin 084822814d fix: models, apikeys Cascader 2026-04-22 13:16:48 +08:00
jialinandjialin 3a58bd1eef fix: show tag only one selected 2026-04-22 13:16:48 +08:00
jialinandjialin 94d3fa356c fix: usage filter 2026-04-22 13:16:48 +08:00
jialinandjialin 7d75714662 feat: usage 2026-04-22 13:16:48 +08:00
jialinandjialin b057d52499 fix: switch model do not work in chat 2026-04-17 20:35:16 +08:00
jialinandjialin 2d726ded30 feat: admin apikeys 2026-04-17 20:35:16 +08:00
jialinandjialin f45d9bda61 style: font size 2026-04-16 15:16:47 +08:00
jialinandjialin 684c1ab600 fix: apikey model access 2026-04-16 15:03:59 +08:00
jialinandjialin 3ac2720ba8 chore: remove experimental from metax 2026-04-16 15:03:59 +08:00
jialinandjialin 7b743f35b3 fix: apikey custom tag 2026-04-15 11:30:40 +08:00
jialinandjialin e1b2a4aee2 fix: python test code 2026-04-15 10:15:36 +08:00
jialinandjialin 308c350582 style: server version 2026-04-15 10:15:36 +08:00
jialinandjialin 41c9b86fd9 fix: k8s volume config 2026-04-14 20:42:01 +08:00
jialinandjialin 46b9855c87 fix: custom apikey 2026-04-14 20:42:01 +08:00
jialinandjialin c667de90ed style: worker versio info 2026-04-14 20:42:01 +08:00
jialinandjialin cf13e3bed0 fix: volume mounts default empty 2026-04-10 15:33:59 +08:00
jialinandjialin 0956538b79 fix: volume name update while typing 2026-04-10 15:17:58 +08:00
jialinandjialin f2a4ab2654 feat: k8s volume mounts 2026-04-10 15:17:58 +08:00
jialinandjialin aeabdab781 fix(style): all scope tag 2026-04-10 09:52:36 +08:00
jialinandjialin f04b5cdc27 feat: custom api key 2026-04-09 21:27:50 +08:00
jialinandjialin b947e3a8b9 fix: show gpu driver version 2026-04-09 21:27:50 +08:00
jialinandjialin ae3148a86f feat: validate tts form items 2026-04-09 12:14:36 +08:00
jialinandjialin 78bf76e965 fix: python code for eidting image 2026-04-09 12:14:36 +08:00
jialinandjialin 7beb5756f7 fix: chat content height 2026-04-09 12:14:36 +08:00
jialinandjialin a2b0236ea3 refactor: table filters ux 2026-04-08 18:54:06 +08:00
jialinandjialin 144914110a feat: more filters component 2026-04-08 18:54:06 +08:00
jialinandjialin c73609d155 fix: adjust border raduis 2026-04-08 18:54:06 +08:00
jialinandjialin 53cd8ba00c fix: page error while route changing 2026-04-08 18:54:06 +08:00
jialinandjialin 1c09cc6c8c refactor: ui/ux 2026-04-08 18:54:06 +08:00
jialinandjialin 06160546a6 feat: show the worker version 2026-03-31 15:05:38 +08:00
jialinandjialin 0b292829fa fix(style): select content align 2026-03-31 15:05:38 +08:00
jialinandjialin 392c51fced chore: instance state filter 2026-03-26 18:20:55 +08:00
jialinandjialin 144d5a6d5f style: instance cell style 2026-03-26 18:20:55 +08:00
jialinandjialin 43dfc7e1f0 fix: normalize parameter string by removing line-continuation backslashes 2026-03-26 18:20:55 +08:00
jialinandjialin adde7fba37 feat: add instance view 2026-03-26 18:20:55 +08:00
jialinandjialin 33fe180997 refactor: model instance item 2026-03-26 18:20:55 +08:00
jialinandjialin a95b7e9561 feat: add instance view 2026-03-26 18:20:55 +08:00
jialinandjialin 08330e0b82 fix: row-textarea upload img 2026-03-26 17:59:33 +08:00
jialinandjialin c74118e913 refactor: embedding messages format 2026-03-26 17:59:33 +08:00
jialinandjialin bb3cef89c1 fix(style): dashboard usage filters 2026-03-26 17:59:33 +08:00
jialinandjialin 589936199c chore: sharegpt description 2026-03-26 17:59:33 +08:00
jialinandjialin 710e2e1996 fix: a non-running instance is selected in creating benchmark 2026-03-26 17:59:33 +08:00
bakiburakogunandjialin aa794c7646 fix(i18n): add missing ShareGPT profile and fix untranslated model tips in tr-TR 2026-03-25 09:48:20 +08:00
jialinandjialin 48779aed29 fix: add ShareGPT profile 2026-03-24 16:29:41 +08:00
jialinandjialin 3907e1ac76 fix(style): hint-input minwidth 2026-03-24 16:29:41 +08:00
jialinandjialin 4d6af4fbf8 fix: copybutton do not work 2026-03-24 10:37:15 +08:00
bakiburakogunandjialin 9c3b0efb30 revert: restore fileName: any for consistency with other locale files 2026-03-23 15:55:07 +08:00
Baki Burak Öğünjialingemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
8bcb7ffe4d Update src/locales/tr-TR.ts
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-23 15:55:07 +08:00
bakiburakogunandjialin 77f0740ec9 feat(i18n): add Turkish (tr-TR) locale translation
Add complete Turkish localization for the GPUStack UI including all 18 translation files covering common UI, menus, dashboard, models, playground, resources, API keys, users, backends, benchmarks, clusters, providers, routes, shortcuts, usage, and vendor names.
2026-03-23 15:55:07 +08:00
jialinandjialin 8b5e407758 fix: alert info height 2026-03-20 17:23:55 +08:00
jialinandjialin 6c88a5554f fix: bedrock required fields 2026-03-20 17:23:55 +08:00
jialinandjialin d779ee06b1 fix: typos: position 2026-03-20 17:23:55 +08:00
jialinandjialin f873d4e245 fix: show required fields for provider 2026-03-20 17:23:55 +08:00
jialinandjialin 0a0e03dc68 fix: open the advanced when configured 2026-03-20 17:23:55 +08:00
jialinandjialin f0e19c8934 fix: spin size 2026-03-19 12:28:18 +08:00
jialinandjialin a6af51dc32 fix: delay querying backends 2026-03-19 12:28:18 +08:00
jialinandjialin fd1a079271 refactor: deployments dir tree 2026-03-19 12:28:18 +08:00
jialinandjialin 9840a48301 fix: depercated props 2026-03-19 12:28:18 +08:00
jialinandjialin 2dc7c9adf1 feat: show the apikey mask value 2026-03-17 16:35:55 +08:00
jialinandjialin a86bfe7fd3 chore: upgrade antd 6.3.3 2026-03-17 16:35:55 +08:00
jialinandjialin d99475bb80 style: table overflow scroller style 2026-03-17 16:35:55 +08:00
jialinandjialin 194b7aff2e fix: autofilled in add user form 2026-03-17 16:35:55 +08:00
jialinandjialin f6d5733183 fix: video gen 2026-03-17 16:35:55 +08:00
jialinandjialin 0ca055b8e8 fix: parser multiple backend pramas on paste 2026-03-17 16:35:55 +08:00
jialinandjialin 9aae2c7f50 fix: use html audio to load stream 2026-03-17 16:35:55 +08:00
jialinandjialin c29ad1270b fix: stt streaming response handler 2026-03-17 16:35:55 +08:00
jialinandjialin 49a60c25af feat: add streaming for stt 2026-03-17 16:35:55 +08:00
jialinandjialin 39bcc158bb feat: add stream mode for tts 2026-03-17 16:35:55 +08:00
jialinandjialin 4f02bcd40c feat: paste multiple lines in parameters input 2026-03-17 16:35:55 +08:00
jialinandjialin 556c4a434d chore: benchmark profile filter 2026-03-17 16:35:55 +08:00
jialinandjialin d389b035b7 refactor: playground params form 2026-03-17 16:35:55 +08:00
jialinandjialin 9447088f89 refactor: adjust playground pages dir 2026-03-17 16:35:55 +08:00
jialinandjialin 64955c26a7 refactor: playground params container 2026-03-17 16:35:55 +08:00
jialinandjialin 68519223fa fix: pagination cache for table list 2026-03-17 16:35:55 +08:00
jialinandjialin e72cacc4b2 chore: autocomplete user info 2026-03-17 16:35:55 +08:00
jialinandjialin ed4be2328f chore: store pagination for list 2026-03-17 16:35:55 +08:00
jialinandjialin e241c6cb6f refactor: embeddding input list 2026-03-17 16:35:55 +08:00
jialinandjialin 6e98fb4274 fix: reset filter in export modal 2026-03-16 14:48:46 +08:00
jialinandjialin 83f6f41787 fix: show backend warning hint after submitting in editing mode 2026-03-16 14:48:46 +08:00
jialinandjialin 18c10e5839 chore: update model cols 2026-03-16 14:48:46 +08:00
jialinandjialin 11de47c813 style: same key tooltip 2026-03-16 14:48:46 +08:00
jialinandjialin 85ea619b18 fix: title for editing apikey 2026-03-16 14:48:46 +08:00
jialinandjialin 3f57cf21f7 feat: add profile filter in benchmark 2026-03-16 14:48:46 +08:00
jialinandjialin b75c773879 chore: add nvidia notes 2026-03-16 14:48:46 +08:00
jialinandjialin 95070ae382 feat: display provider models 2026-03-16 14:48:46 +08:00
jialin 353ee3a9ae fix: route target can be set 0 2026-03-10 19:06:49 +08:00
jialin 972e147fdf fix: yaml edior height 2026-03-10 19:06:49 +08:00
jialin 73e52fe334 chore: add hint for creating backend 2026-03-09 15:48:16 +08:00
jialin cf521ad79e fix: default_env field not display in backend editing yaml 2026-03-02 10:21:21 +08:00
jialin 76a3e5cfcf fix: custom config overwrite input value 2026-02-25 10:42:06 +08:00
jialin 200d63e5fc fix: add custom config in get-models, test-model 2026-02-25 10:28:31 +08:00
jialin 0aeefb1217 fix: allow deleting version for community backend 2026-02-24 17:23:42 +08:00
jialin 7dfeb859e2 refactor: query dashboard data 2026-02-24 16:33:28 +08:00
jialin 5151f26b9e fix: miss openaiCustomUrl in get-models payload 2026-02-24 15:36:41 +08:00
jialin 053e5cca86 chore: markdown for community backend detail 2026-02-24 11:37:22 +08:00
jialin 89765c19c4 fix: copy multi lines when == 2026-02-24 11:07:53 +08:00
jialin 0824f0c13b fix: provider proxy_url set null when disabled 2026-02-24 11:07:53 +08:00
jialin 04092c3fa5 fix: openaicustomurl do not display 2026-02-24 11:07:53 +08:00
jialin d8258cf676 fix: worker list params do not update 2026-02-14 12:06:45 +08:00
jialin 97d6eee5ba chore: icons static files 2026-02-13 20:36:46 +08:00
jialin 511297ed11 fix: do not cache while watching during manual updates 2026-02-13 19:32:59 +08:00
jialin 88aafbaf7b refactor: list watch trigger 2026-02-13 16:12:56 +08:00
jialin af9890b16c style: community backend detail title 2026-02-13 12:26:43 +08:00
jialin c67a8c4120 fix: add other category 2026-02-12 19:38:47 +08:00
jialin 16c0e00b4f chore: diff envs in editing deployment 2026-02-12 19:38:47 +08:00
jialin d1c1c5acf9 chore: corex metax notes 2026-02-12 14:56:25 +08:00
jialin 9cb7145b4e fix: provider yaml inital value 2026-02-12 12:20:05 +08:00
jialin 978d327bcd chore: form tabs active change 2026-02-12 12:20:05 +08:00
jialin 07664b5f22 chore: quick create route 2026-02-12 12:20:05 +08:00
jialin b21fe0ac4c style: error message toast 2026-02-12 12:20:05 +08:00
jialin 932c30cd7f fix: enable_model_route set true in cloning 2026-02-11 20:35:19 +08:00
jialin 59c19f3fae fix: update add worker command 2026-02-11 17:54:34 +08:00
jialin c9245f957e fix: enable_model_route value in cloning 2026-02-11 17:54:34 +08:00
jialin 228cd4e664 fix: benchmark detail envs gpus list 2026-02-11 16:50:49 +08:00
jialin 289a651d52 fix: default language value 2026-02-11 16:14:06 +08:00
jialin 1b8c17ce92 fix: tts params filter 2026-02-11 15:30:35 +08:00
jialin e66de732ac fix: copy button do not work 2026-02-11 15:30:35 +08:00
jialin 2ba94f7524 fix: miss model file path in cloning 2026-02-11 11:05:43 +08:00
jialin 3f90642726 chore: request result in list 2026-02-10 17:29:57 +08:00
jialin 35ae7b9643 fix(style): adjust ui 2026-02-10 17:29:57 +08:00
jialin 15d635322b fix: target model text overflow 2026-02-10 17:29:57 +08:00
jialin c3d5234710 fix: new added model item is cleared 2026-02-10 17:29:57 +08:00
jialin 9b498d10d5 fix: dashboard model data format 2026-02-10 11:33:24 +08:00
jialin 9418e5b635 fix: get models in cloning 2026-02-10 11:33:24 +08:00
jialin 8779b79bbf fix: get models in cloning 2026-02-10 10:25:02 +08:00
jialin ba11689029 feat: filter form for table 2026-02-10 10:25:02 +08:00
jialin 90e212a1b2 fix: reset default columns do not work 2026-02-09 18:02:30 +08:00
jialin 198a52e230 chore: add runtime in register k8s command 2026-02-09 15:58:29 +08:00
jialin e7890dda3d chore: show fallback change warning 2026-02-09 13:26:44 +08:00
jialin 83086c46e6 fix: target options miss deployment models 2026-02-09 11:51:26 +08:00
jialin 1314123ad7 fix: api_key format 2026-02-09 11:51:26 +08:00
jialin cb13873098 fix: deduplicate models before submitting 2026-02-09 11:51:26 +08:00
jialin fba430999d fix(style): error message toast 2026-02-09 09:35:42 +08:00
jialin 293c53d8dd chore: keep error message visiable on hover 2026-02-08 19:44:43 +08:00
jialin 33ce334bd7 fix: verify same model selected 2026-02-08 19:44:43 +08:00
jialin 379eeedde2 fix: deduplicate in select provider models and target models 2026-02-08 17:20:05 +08:00
jialin ec6f5d1ad3 chore: add copy button for run command 2026-02-08 10:27:49 +08:00
jialin f35ba8f8e5 fix: success message in creation cluster 2026-02-08 10:27:49 +08:00
jialin 21ffd2a564 fix: env params incorrect after switching between vendors 2026-02-07 16:51:09 +08:00
jialin 3c5b095510 fix: benchmark enviroment table 2026-02-06 20:59:47 +08:00
jialin 096227e3da fix: benchmark tooltip issues 2026-02-06 18:34:20 +08:00
jialin 4a582ec8b1 fix: benchmark tooltip 2026-02-06 18:34:20 +08:00
jialin 4132494a49 chore: provider masked api-key 2026-02-06 17:33:06 +08:00
jialin 1bd31d2936 fix: stt languages sorting 2026-02-06 17:33:06 +08:00
jialin 18ffeb82a2 fix: benchmark form data error in editing 2026-02-06 15:36:24 +08:00
jialin da985871cc fix: benchmark issues 2026-02-06 14:27:05 +08:00
jialin 4ff5b3e05a chore: grafana entry 2026-02-06 14:27:05 +08:00
jialin 7f3d6bb55f fix: ui issues 2026-02-06 11:13:49 +08:00
jialin d54722609c fix: remove duplicate selected models 2026-02-06 11:13:49 +08:00
jialin 2765d5edeb chore: tts, stt meta 2026-02-05 20:35:07 +08:00
jialin a1a7979fb3 fix: update open playground btn 2026-02-05 11:55:05 +08:00
jialin 4e8b5e26ae feat: monitor button 2026-02-04 20:14:25 +08:00
jialin 47596fdb1a fix: copy button do not work 2026-02-04 20:14:25 +08:00
jialin 332521a7f3 feat: grafana link 2026-02-04 20:14:25 +08:00
jialin 8690de00a9 feat: add grafana link 2026-02-04 20:14:25 +08:00
jialin 7fd2b43704 fix: refresh enable backend state 2026-02-04 14:58:48 +08:00
jialin 05c05419fc feat: duplicate deployment 2026-02-04 14:58:48 +08:00
jialin 5ad9ac277c style: benchmark progress 2026-02-03 20:50:40 +08:00
jialin 42f24245b5 fix: maas provider custom config 2026-02-03 20:26:00 +08:00
jialin 7548836b67 fix: reranker for sglang 2026-02-03 19:12:34 +08:00
jialin a2c33affcd fix: file import error 2026-02-03 18:27:49 +08:00
jialin 11039a5c82 fix: enable_model_route 2026-02-03 18:21:08 +08:00
jialin 46969702a8 fix: open model in playground 2026-02-03 18:21:08 +08:00
jialin 134827a0f7 chore: resort menu 2026-02-03 18:21:08 +08:00
jialin f0390682ce chore: rebase main 2026-02-03 18:21:08 +08:00
jialin 2a6846d2c0 chore: remove invalid file 2026-02-03 18:21:08 +08:00
jialin dc8b3b9210 fix: routes locales 2026-02-03 18:21:08 +08:00
jialin dcda9be50b style: display target model name 2026-02-03 18:21:08 +08:00
jialin 04c25ab0f7 chore: fallback selection 2026-02-03 18:21:08 +08:00
jialin 051d9421b0 chore: access, endpoints to route targets 2026-02-03 18:21:08 +08:00
jialin 6d65797b4f fix: access source error 2026-02-03 18:21:08 +08:00
jialin 497813eced fix(styles): providers access token 2026-02-03 18:21:08 +08:00
jialin 26e3a1944b chore: access form test 2026-02-03 18:21:08 +08:00
jialin e188d788b9 chore: provider form test 2026-02-03 18:21:08 +08:00
jialin d86d061f97 style: access list 2026-02-03 18:21:08 +08:00
jialin 35918d2a00 chore: access meta 2026-02-03 18:21:08 +08:00
jialin 51bab71291 style: adjust providers style 2026-02-03 18:21:08 +08:00
jialin 6fd886b27a style: metadata list styles 2026-02-03 18:21:08 +08:00
jialin 2211009cce chore: providers logo 2026-02-03 18:21:08 +08:00
jialin eb65cee280 style: fallback ui 2026-02-03 18:21:08 +08:00
jialin a3dd126931 chore: fallback checkbox 2026-02-03 18:21:08 +08:00
jialin 0b2be1e54b chore: model access control 2026-02-03 18:21:08 +08:00
jialin 337d93ff51 style: endpoint selection 2026-02-03 18:21:08 +08:00
jialin df5c2be7fa feat: metadata list 2026-02-03 18:21:08 +08:00
jialin 15cd9795d5 style: providers selection, remove fallback form 2026-02-03 18:21:08 +08:00
jialin 5fcdf4ea00 chore: access form 2026-02-03 18:21:08 +08:00
jialin e8e982559d chore: providers ux 2026-02-03 18:21:08 +08:00
jialin b2a8d27178 feat: provider form 2026-02-03 18:21:08 +08:00
jialin 679e10abd6 feat: add access list 2026-02-03 18:21:08 +08:00
jialin 34331063eb feat: provider lsit 2026-02-03 18:21:08 +08:00
jialin 2dfdd4a0d9 feat: add provider menu 2026-02-03 18:21:08 +08:00
jialin cb5413c2ce fix: backend version list 2026-02-03 16:05:43 +08:00
jialin 9e7f2261f3 fix: max token not a int number 2026-02-03 16:05:43 +08:00
jialin 5efed8f193 fix: do not set default deployment name 2026-02-03 16:05:43 +08:00
jialin 0af7e95af2 fix: do not display as group when has one 2026-02-03 15:41:16 +08:00
jialin cf3b225d3e fix: edit community backend 2026-02-03 15:41:16 +08:00
jialin 32f95f5d7d fix: revert backend selection 2026-02-03 15:41:16 +08:00
jialin 9a5a1bf555 chore: add mutiple additional volume 2026-02-02 15:58:01 +08:00
jialin b7dfb0af0b chore: export action for benchmark item 2026-02-02 15:58:01 +08:00
jialin 4a71387098 fix: do not show evalute result when no claims 2026-02-02 15:58:01 +08:00
jialin f651ab7fd9 fix: default benchmark form values 2026-02-02 14:10:46 +08:00
jialin fc599a0637 style: column setting sub title 2026-02-02 14:10:46 +08:00
jialin 9796233897 feat: benchmark detail actions 2026-02-01 22:56:36 +08:00
jialin 0849a2f114 chore: column settings 2026-02-01 20:22:25 +08:00
jialin 043218937f chore: benchmark detail locales 2026-02-01 20:22:25 +08:00
jialin 7b4d60b576 feat: add ref_text, x_vector_only_mode 2026-01-31 16:53:35 +08:00
jialin f803b910b5 fix: tts default params 2026-01-31 14:39:44 +08:00
jialin 8d660b20aa fix: miss default name in deploy 2026-01-31 14:39:44 +08:00
jialin 1e298bbbc0 fix: tts viewcode params 2026-01-31 14:06:50 +08:00
jialin 14eb54481d chore: remove advanced toggle in image 2026-01-31 14:06:50 +08:00
jialin 7a5c28228b chore: upload a ref audio 2026-01-31 14:06:50 +08:00
jialin f278716b7e fix: hidden tokens input 2026-01-30 23:14:23 +08:00
jialin b3e186fea4 feat: add tts params 2026-01-30 22:58:11 +08:00
jialinandLawrence Li f0cdefad90 chore: update icons 2026-01-30 20:48:55 +08:00
jialinandLawrence Li 507b0e44d5 fix: init envs 2026-01-30 20:48:55 +08:00
jialinandLawrence Li 56985be26b chore: default_env, env 2026-01-30 20:48:55 +08:00
jialinandLawrence Li d3a0c6a330 style: arrow bivider 2026-01-30 20:48:55 +08:00
jialinandLawrence Li 0d5cd28d38 feat: community backends marketplace 2026-01-30 20:48:55 +08:00
jialinandLawrence Li b6bd9cd7dd feat: community backends page 2026-01-30 20:48:55 +08:00
jialinandLawrence Li 2dab5093dc fix: parse yaml error 2026-01-30 20:48:55 +08:00
jialinandLawrence Li 4a4a02eb0d chore: update env vars from backend version 2026-01-30 20:48:55 +08:00
jialinandLawrence Li 4000aacb2c fix: backend selection 2026-01-30 20:48:55 +08:00
jialinandLawrence Li a2be7f6b36 chore: backend api 2026-01-30 20:48:55 +08:00
jialin af6f90c228 fix: benchmark state 2026-01-30 18:48:55 +08:00
jialin 3df2d23bf5 fix: benchmark detail styles 2026-01-30 18:48:55 +08:00
jialin d173e2d49b fix: details layout 2026-01-30 18:48:55 +08:00
jialin 5747cae87a style: detail layout 2026-01-30 18:48:55 +08:00
jialin 667751dc5f refactor: env detail 2026-01-30 18:48:55 +08:00
jialin 577996f507 refactor: summary 2026-01-30 18:48:55 +08:00
jialin 22e42e279c chore: logs 2026-01-30 18:48:55 +08:00
jialin 6c42b87c57 chore: update creation form 2026-01-30 18:48:55 +08:00
jialin 3fe63f836f chore: remove labels 2026-01-30 18:48:55 +08:00
jialin 1a2e82f079 chore: profile config 2026-01-30 18:48:55 +08:00
jialin 8f2eea70f6 chore: detail api 2026-01-30 18:48:55 +08:00
jialin 358df925e7 chore: list actions 2026-01-30 18:48:55 +08:00
jialin 9ab8f233a2 feat: benchmark detail page 2026-01-30 18:48:55 +08:00
jialin fb0e45ebed feat: benchmark form 2026-01-30 18:48:55 +08:00
jialin 37b814b70a feat: benchmark list 2026-01-30 18:48:55 +08:00
jialin 8b282afb03 fix: vllm run command 2026-01-22 17:39:01 +08:00
jialin ec9a4b2607 fix: duplicate watch created 2026-01-20 14:51:45 +08:00
jialin d5f3158638 fix: recreate watch request after cluster changed 2026-01-20 13:40:15 +08:00
jialin eb5e344b41 style: gpu vendor logo 2026-01-20 10:36:38 +08:00
jialin 9d13b27c9e fix: add worker message trigger 2026-01-20 10:36:38 +08:00
jialin b4f69a4e2e perf: cancel the request when leaving page 2026-01-16 16:53:38 +08:00
jialin 3e359a69c7 fix: set loadingWatch state when the loading begins 2026-01-16 11:37:47 +08:00
jialin 9de4054851 style: t-head logo 2026-01-15 19:54:20 +08:00
jialin 9676e63b5e feat: add t-head 2026-01-15 19:54:20 +08:00
jialin 337cb67cd9 fix: fetch list axios token incorrect 2026-01-15 17:48:45 +08:00
jialin fe79258766 fix: remove updateManually on model files 2026-01-15 16:43:44 +08:00
jialin 0a9cc1e17a fix: cache current list query params 2026-01-15 16:20:05 +08:00
jialin 6445061836 fix: page changing do not trigger watch 2026-01-15 15:07:55 +08:00
jialin 19df710a0d fix(style): autocomplete width out of range 2026-01-15 11:17:05 +08:00
jialin 0d8333eac6 style: textarea max rows 2026-01-15 11:17:05 +08:00
jialin b1cb4bbe32 fix: minimatch error 2026-01-15 09:28:19 +08:00
jialin 11b9430b15 fix: worker list update by watch 2026-01-14 20:12:39 +08:00
jialin 1230c3bd28 fix: worker list update by watch 2026-01-14 19:58:09 +08:00
jialin 2ee645b1ee fix: too many requests after query change 2026-01-14 18:02:08 +08:00
jialin 84ce308d9d fix: hint input width 2026-01-14 18:02:08 +08:00
jialin be631d021e feat: get initial password command 2026-01-14 17:19:43 +08:00
jialin a37458fd9e fix: update worker by fetchData 2026-01-14 16:01:47 +08:00
jialin 095b9478cc fix: form submit on video 2026-01-14 16:01:47 +08:00
jialin 94fec52329 chore: scrollable tabs 2026-01-14 16:01:47 +08:00
jialin fc4d71139a style: playground right side 2026-01-14 16:01:47 +08:00
jialin c813344c7c fix: the max embedding value exceeds the limit. 2026-01-13 20:57:50 +08:00
jialin f0bfbfe693 fix: re-create watch request after filtering 2026-01-13 18:43:11 +08:00
jialin 741cf07f2e fix(style): model file list text overflow 2026-01-13 18:43:11 +08:00
jialin 5ff26e1ce8 chore: video test code 2026-01-13 18:43:11 +08:00
jialin 342d977fe4 fix: -custom error message on creating backend 2026-01-13 18:43:11 +08:00
niu_heandjialin 9c1011fbd8 Add JSX as a global variable in ESLint config 2026-01-13 17:22:03 +08:00
jialin daaf77a89f fix: do not fixed node version in package.json 2026-01-13 09:29:51 +08:00
jialin 420600510d fix(style): remove dot symbol when no size 2026-01-12 20:42:05 +08:00
jialin 0ae9a7f42f fix: gpuindex sort 2026-01-12 20:36:38 +08:00
jialin a1cddfa18b chore: hide cluster detail 2026-01-12 20:30:24 +08:00
jialin 89fe8e68f4 feat: playground video 2026-01-12 20:30:24 +08:00
jialin cd3b0607a5 style: modal drawer blur 2026-01-12 20:30:24 +08:00
jialin 0cde6f7dbc chore: add models and gpus in cluster detail page 2026-01-12 20:30:24 +08:00
jialin 42943a33fe chore: display allocated vram on instance 2026-01-12 14:52:59 +08:00
jialin fc76822bdf fix: catalog size 2026-01-12 12:24:34 +08:00
jialin 05ad296b43 chore: cluster system load service 2026-01-12 12:24:34 +08:00
jialin 2e5b075d1b fix: header bg color 2026-01-12 12:24:34 +08:00
EVGENY Mandjialin f47348106e Update backends.ts 2026-01-10 17:14:17 +08:00
jialin f351447f09 chore: remove editor static files 2026-01-09 21:13:41 +08:00
jialin 10b2a8b4f9 fix: editor incompatibility with firefox79 2026-01-09 20:51:48 +08:00
jialin afcd3e5693 feat: add cluster detail 2026-01-09 20:51:48 +08:00
jialin 7b5ce83cbd fix: add worker default selection is incorrect 2026-01-08 11:01:06 +08:00
jialin 0cff804cd7 fix: add worker title 2026-01-08 09:26:55 +08:00
jialin f4e6bf7fd5 fix: gpuindexs sort 2026-01-08 09:26:55 +08:00
jialin ba4f277863 fix: add worker ux when only DO cluster 2026-01-08 09:26:55 +08:00
jialin d35bd16543 fix: cluster pending status 2026-01-08 09:26:55 +08:00
jialin 065841530d fix: slider marker label 2026-01-07 15:55:26 +08:00
jialin 28a73d2a6e chore: use drawer for creation 2026-01-07 15:55:26 +08:00
jialin bbf09c2ea9 style: command viewer scroller 2026-01-07 15:55:26 +08:00
jialin 8f9fae9210 style: use drawer for adding worker 2026-01-06 17:21:32 +08:00
jialin 0eba1da6c4 style: cluster creation steps 2026-01-06 17:21:32 +08:00
jialin 0ba8300959 fix: no clusters tips in adding worker modal 2026-01-06 17:21:32 +08:00
jialin f8ae7680ad fix: updating model name should show the recreation message 2026-01-06 17:21:32 +08:00
jialin d51f00d35d style: cluster creation modal 2026-01-06 17:21:32 +08:00
jialin 0f7a475ec9 feat: add context length 2026-01-06 17:21:32 +08:00
jialin d8b3331648 style: slider handle color 2026-01-06 17:21:32 +08:00
jialin 2816fedc36 refactor: catalog fetch data 2026-01-06 17:21:32 +08:00
jialin 17de9d98f4 chore(deps): upgrade antd to v6 2026-01-06 17:21:32 +08:00
jialin b2f5eb8850 style: user usage rank 2026-01-06 17:21:32 +08:00
jialin c821a2e463 refactor: create cluster ux 2026-01-06 17:21:32 +08:00
jialin 66e8f83395 fix: did not cache workers and clusters in model files 2025-12-31 10:23:15 +08:00
jialin 41ebceca8f chore: static iconfont files 2025-12-29 15:40:36 +08:00
jialin 632685672c fix: wheel event passive 2025-12-29 15:28:40 +08:00
jialin bd2e4bb633 docs: hygon notes 2025-12-29 09:36:48 +08:00
jialin 835633d44b fix: help menu item clickable area 2025-12-26 18:18:32 +08:00
EVGENY Mandjialin 75773e6b00 Update models.ts 2025-12-26 18:16:33 +08:00
EVGENY Mandjialin a21b9b5244 Update users.ts 2025-12-26 18:16:02 +08:00
EVGENY Mandjialin 38bf76dc14 Update common.ts 2025-12-26 18:15:29 +08:00
EVGENY Mandjialin 9461341104 Update clusters.ts 2025-12-26 18:15:05 +08:00
jialin 5b5b2c6364 fix: chat compare switch model meta 2025-12-26 17:29:36 +08:00
jialin a006263e51 fix: add worker to default cluster 2025-12-26 12:08:30 +08:00
jialin febdd38f7c fix: set submitloading as false in catch 2025-12-26 09:48:10 +08:00
jialin 1b4d335b09 fix: store hideModel value in global session 2025-12-25 20:36:48 +08:00
jialin 725409a576 fix: image seed do no clear 2025-12-25 17:57:11 +08:00
jialin 9b25cc51e4 style: user rank chart 2025-12-25 17:57:11 +08:00
jialin 9dcdb6b6e7 fix: reset userSettings first login 2025-12-25 13:14:59 +08:00
jialin 73b987358f fix(style): cluster options 2025-12-24 20:52:48 +08:00
jialin 84c2bf130c style: cluster selector 2025-12-24 20:37:20 +08:00
jialin b25189feea fix: cancel sorting 2025-12-24 15:40:19 +08:00
jialin a9b58a5564 fix: cluster filter do not work in dashboard 2025-12-24 12:20:56 +08:00
jialin 530b20c633 chore: add resource modal button text 2025-12-24 10:53:53 +08:00
jialin fa0aeac10b fix: remove default sorting status on UI 2025-12-23 20:54:16 +08:00
jialin 1b661bb8cd feat: set default cluster 2025-12-23 20:54:16 +08:00
jialin 530e8f7537 fix: replicas, ready_replicas sorting 2025-12-23 18:35:33 +08:00
jialin 9e019a98f6 fix: click create hide modal 2025-12-23 10:51:58 +08:00
jialin 10c6cf9f7e fix: init image seed 2025-12-23 10:51:58 +08:00
jialin 480b238e44 fix: expand all model clear instances cache 2025-12-23 10:51:58 +08:00
jialin 32bdbc693a fix: onTableChange only handles sorting 2025-12-22 19:41:52 +08:00
jialin ab146b6b6b fix: allow to enter seed 2025-12-22 18:11:46 +08:00
jialin 763929eafc fix: instance backend data ui compatability with old data 2025-12-22 18:11:46 +08:00
jialin 711b3fee98 fix: user guidance when no resource 2025-12-22 18:11:46 +08:00
jialin 0d0592eee9 fix: sorter tooltip 2025-12-22 16:41:44 +08:00
jialin cc7948ba45 fix: update Server as GPUStack Server 2025-12-22 16:19:47 +08:00
jialin 7e25b64689 fix: remove instance from cache after deleting 2025-12-22 16:19:47 +08:00
Yuxing Dengandjialin d844cdadb5 fix: update advertise address title and description 2025-12-22 15:14:29 +08:00
jialin e3b3f51e87 fix: ignore the sort_by when no data 2025-12-22 11:57:57 +08:00
jialin 45efda7f1d fix: single sorted field, remove token 2025-12-22 10:10:35 +08:00
jialin db45c861e4 feat: models filter by state 2025-12-21 21:37:05 +08:00
jialin 42f8e6a6d9 chore: set col order 2025-12-21 21:37:05 +08:00
jialin 23a761226a feat: table list sorter 2025-12-21 21:37:05 +08:00
jialin 6738dfe0d3 fix: anyway submit disabled when no catalog specs 2025-12-19 20:33:25 +08:00
jialin 6e16b2eb0c fix: submit pool data from a validate failed form 2025-12-19 20:33:25 +08:00
jialin 707eb15465 fix: update command of adding worker 2025-12-19 20:33:25 +08:00
jialin 8008099e71 fix: image default seed 2025-12-19 20:33:25 +08:00
jialin 79ccb96c95 fix: edit worker_config 2025-12-19 16:44:52 +08:00
jialin bd76934e40 fix: delete worker pool 2025-12-19 15:19:27 +08:00
jialin bb793a41fc fix: entrypoint do not display in edit 2025-12-19 15:00:10 +08:00
jialin ad048a92ed feat: backend entrypoint 2025-12-19 14:40:20 +08:00
jialin 14d944ad2f style: cluster advanced scroller 2025-12-18 20:03:00 +08:00
jialin e1b8b5696c fix: update instance backend field 2025-12-18 17:29:07 +08:00
jialin 78368e9979 fix: cluster worker config issues 2025-12-18 17:29:07 +08:00
jialin e83bff6923 chore: worker ip 2025-12-18 14:06:32 +08:00
jialin e6c12d81ea fix: edit worker pool miss data 2025-12-18 14:06:32 +08:00
jialin 3a73d0c1b2 style: worker added info status 2025-12-18 12:19:31 +08:00
jialin b524587a9a fix: add worker button do not work 2025-12-18 10:56:45 +08:00
jialin e4bd753355 style: no resource modal 2025-12-17 19:58:28 +08:00
jialin 30536cb04a fix: remove advanced agrs in image 2025-12-17 16:15:34 +08:00
jialin da1efa9270 fix: password length 64 2025-12-17 16:15:34 +08:00
jialin bd6f4b3f76 fix: add worker, create cluster 2025-12-17 14:59:07 +08:00
jialin 5e48d75ead fix: add worker message 2025-12-17 14:59:07 +08:00
jialin bd46fcdc75 fix: container name in add worker 2025-12-17 14:59:07 +08:00
jialin 6968f9fa6b feat: worker_config 2025-12-16 18:43:28 +08:00
jialin 5225fd328d fix: backend framework options 2025-12-16 11:11:24 +08:00
jialin fa42474612 chore: worker added message 2025-12-15 15:13:57 +08:00
jialin d2eda78af0 fix: add worker command container_name 2025-12-15 10:18:16 +08:00
jialin 7a0ee6aac4 style: column wrapper srollable style 2025-12-13 19:47:48 +08:00
jialin b327eedb45 fix: logout error 2025-12-12 17:26:06 +08:00
jialin a68e3ff9da fix: no spec list for catalog 2025-12-12 17:22:28 +08:00
jialin 0500dd2e35 fix: query catalog spec, default_version check 2025-12-12 17:08:30 +08:00
jialin cb43131ccb fix: add worker command 2025-12-12 11:14:57 +08:00
jialin 883e0ab115 feat: get initial password 2025-12-12 11:14:57 +08:00
jialin b189160888 fix: docs for gpu link 404 2025-12-11 18:14:25 +08:00
jialin 3dbb0de683 feat: add resource for first login 2025-12-11 17:50:39 +08:00
jialin b38bc8a207 fix: table sorter 2025-12-11 13:33:41 +08:00
jialin 3328828da6 refactor: card list resize container 2025-12-11 13:33:41 +08:00
jialin 7fdabd90a5 fix: update add worker command 2025-12-10 15:50:53 +08:00
jialin d8452e98f5 style: drawer styles 2025-12-10 15:50:53 +08:00
jialin dda2213593 style: workers page no page container 2025-12-10 15:50:53 +08:00
jialin 04f995b80c style: resize terminal height 2025-12-10 15:50:53 +08:00
jialin a08f1e2512 chore: rename ground-left as ground-llm 2025-12-10 15:50:53 +08:00
jialin af4849d6cc style: terminal panel 2025-12-10 15:50:53 +08:00
jialin 087675889f feat: model cache volume mount, clear gpu selector 2025-12-09 19:07:40 +08:00
jialin daa10617c0 chore: prefetch chunk file 2025-12-05 13:31:56 +08:00
jialin c3b5c13cc5 fix: show info when adding worker error 2025-12-05 11:45:44 +08:00
jialin 1dd83645bd fix: reset first login flag after changing password 2025-12-05 11:26:32 +08:00
jialin 2df7c17bc1 chore: remove experimental from hygon 2025-12-04 22:35:15 +08:00
jialin a274349ace chore: upgrade info 2025-12-04 16:43:33 +08:00
jialin 1c699fe307 chore: tidy code 2025-12-04 16:43:33 +08:00
jialin f0a3e84e4f fix: set default os image 2025-12-04 10:48:34 +08:00
jialin f87989d32e fix: clear os_image when it's not in new image list 2025-12-04 10:12:19 +08:00
jialin 7355be9e3a fix: init cluster id when deploy model 2025-12-03 19:18:07 +08:00
jialin d8f1e95e1a fix: use image label in inputbox 2025-12-03 16:00:59 +08:00
jialin 59eace702b fix: add worker init steps failed 2025-12-03 12:32:04 +08:00
jialin 8a24ba0252 fix: cluster option disabled 2025-12-03 11:50:35 +08:00
jialin 03999a9d2c chore: os image filter 2025-12-03 11:38:16 +08:00
jialin f335cb1775 fix: click icon do not worker on upload 2025-12-02 17:24:14 +08:00
jialin b9c034469b fix: input img url fall back image 2025-12-02 15:58:17 +08:00
jialin ce3a82ddda fix: edit message add image 2025-12-02 14:00:58 +08:00
jialin 5cbb38922c feat: add image from url 2025-12-01 19:01:33 +08:00
jialin 14f0afec08 chore: allow space in backend parameters 2025-12-01 10:06:00 +08:00
jialin 769cc09906 fix: logs are not fully loaded 2025-11-30 20:33:16 +08:00
jialin 306daf7591 chore: amd note for add worker 2025-11-27 19:35:04 +08:00
jialin d1c1132e6e style: button for empty 2025-11-27 15:53:23 +08:00
jialin 962df859f1 chore: get started for add cluster 2025-11-27 11:35:45 +08:00
jialin 97601280d1 fix: model download progress text overflow 2025-11-26 10:28:40 +08:00
jialin ede42e99de fix: do not reset the backend after selecting a gguf file 2025-11-25 17:20:09 +08:00
jialin 47cae0134c feat: display deprecated backend versions group 2025-11-25 16:04:27 +08:00
jialin 33defab7df fix: gpus link 2025-11-25 11:34:11 +08:00
EVGENY Mandjialin 6b402e944b Update Russian translations in models.ts 2025-11-24 09:38:32 +08:00
EVGENY Mandjialin f8a6f4c5e5 Translate cluster messages to Russian 2025-11-24 09:38:14 +08:00
EVGENY Mandjialin adb999d3a9 Update dashboard.ts 2025-11-24 09:37:42 +08:00
jialin f4ea23dd14 fix: set default vllm backend for gguf 2025-11-23 21:08:28 +08:00
jialin 5bd0020e49 fix: check vllm backend for gguf model 2025-11-23 19:57:41 +08:00
jialin 782e81568d fix: check the image and run_command valid when select custom backend 2025-11-23 18:51:01 +08:00
jialin 2ecf83ddae fix: warning message for gguf model 2025-11-23 17:27:42 +08:00
jialin de0982d590 fix: compatibility message for gguf 2025-11-23 15:10:46 +08:00
jialin e5755a2eec chore: adjust ui statements 2025-11-22 13:06:05 +08:00
EVGENY Mandjialin e755c34ab5 Translate health check command tips to Russian 2025-11-22 12:19:10 +08:00
EVGENY Mandjialin 85e4f1a5ed Translate common phrases to Russian 2025-11-22 12:18:40 +08:00
EVGENY Mandjialin 3eb403a2c4 Translate user status messages to Russian 2025-11-22 12:18:15 +08:00
jialin 79442a6a6c fix: apikey form value diff 2025-11-21 20:41:20 +08:00
jialin f49001b742 chore: access setting notes 2025-11-21 20:10:21 +08:00
jialin e80ecfac8d style: table header text-overflow 2025-11-21 16:56:23 +08:00
jialin ff67fba2c9 chore: reset the primary color after logout 2025-11-21 16:56:23 +08:00
jialin 3f63831488 fix: modelscope api incorrect 2025-11-21 13:43:39 +08:00
jialin 19babbc73d style: adjust some styles 2025-11-21 12:16:49 +08:00
jialin 26a4d5474d fix(style): gpu_selector position 2025-11-20 20:49:19 +08:00
jialin af3e03230a fix: rerank api prefix 2025-11-20 17:43:13 +08:00
jialin 551f04011a chore: v1 to v2 2025-11-20 17:31:15 +08:00
jialin ea39a45f31 fix: sglang enable across worker 2025-11-20 15:59:05 +08:00
jialin ebff5695ff chore: consistent UI statement 2025-11-20 14:17:08 +08:00
jialin 9b63c1a515 style: example code title 2025-11-20 12:46:06 +08:00
jialin de882dc62e fix: api info example 2025-11-20 11:47:09 +08:00
jialin 8f9562d6a4 style: adjust some ui statements 2025-11-20 11:47:09 +08:00
jialin 5d383ec39b fix: add worker token do not update 2025-11-20 10:31:27 +08:00
jialin 2687fb187d style: adjust ram prcision 2025-11-19 18:47:55 +08:00
jialin ca43c0b4b2 fix(style): fix some styles 2025-11-19 11:46:18 +08:00
jialin 71bbf59467 style: deploy modal message cover the content 2025-11-19 11:46:18 +08:00
jialin 18f861f771 style: framework options 2025-11-18 20:01:54 +08:00
jialin e85d59dfb0 style: adjust some styles 2025-11-18 13:30:58 +08:00
jialin 78c8b60121 fix: re-request catalog specs after changing cluster 2025-11-18 11:28:37 +08:00
jialin e22b5ed516 chore: small fixes and optimizations 2025-11-17 20:15:26 +08:00
jialin 906f59a566 fix: model source error in catalog 2025-11-17 15:24:22 +08:00
jialin d1c3edfd9b fix: remark field option 2025-11-17 15:24:22 +08:00
jialin e8a0f33bde fix: extra newline character 2025-11-16 11:54:27 +08:00
Christianandjialin 825687f2a8 Fix typo in example-code
Remove obsolet bracket in python-example-code
2025-11-16 09:12:59 +08:00
jialin 2852648a65 fix: run command issue 2025-11-16 09:09:04 +08:00
jialin 0f3f31ef45 refactor: add worker 2025-11-15 22:37:44 +08:00
jialin 864cf76c07 feat: worker maintenance 2025-11-13 21:00:35 +08:00
jialin 98e6c71bf8 fix: model list flicker after page active 2025-11-13 17:25:28 +08:00
jialin aee9566bbb fix: yaml editor do not update when upload same file 2025-11-13 16:53:11 +08:00
jialin b61c0d6dee fix: api access info 2025-11-13 12:22:16 +08:00
jialin f963b3a000 chore: config base url 2025-11-13 12:22:16 +08:00
jialin 03963b736a chore: create, edit image handler 2025-11-12 20:47:34 +08:00
jialin a34c375e2d fix: image response handler 2025-11-12 19:55:31 +08:00
jialin e8eea9573e fix: set response_format as b64_json 2025-11-12 19:18:10 +08:00
jialin b7656d65e7 style: large modal height responsive 2025-11-12 19:18:10 +08:00
jialin d1fa6dd03c fix: pool's label editable 2025-11-12 16:37:01 +08:00
jialin 2045bfaf78 fix: display admin and inactive when view 2025-11-12 16:11:17 +08:00
jialin 653ada5f0f fix: do not evaluate from model files 2025-11-12 15:10:00 +08:00
jialin cbc000d35a fix: playground formref is invalid 2025-11-12 14:57:39 +08:00
jialin 11a676be83 fix: download file error 2025-11-12 11:01:13 +08:00
jialin 7eedea8035 chore: generic_prox ux 2025-11-11 20:06:25 +08:00
EVGENY Mandjialin 2d4ddea915 Update menu.ts 2025-11-11 18:47:08 +08:00
EVGENY Mandjialin 76d7a50fac Update models.ts 2025-11-11 18:46:44 +08:00
jialin 84187eedc4 fix: access control, voices options 2025-11-11 15:47:32 +08:00
jialin ee5c30934b feat: generic_proxy 2025-11-11 15:47:32 +08:00
jialin b4b25d4300 fix: default enter page for user 2025-11-10 20:40:15 +08:00
jialin 9eb1dba4a1 fix: calc scrollheight dynamically for tabs change 2025-11-10 20:40:15 +08:00
jialin 285e274818 fix: display image menu 2025-11-10 10:07:25 +08:00
jialin 0077d109e7 fix: remove page_size 2025-11-07 17:31:39 +08:00
jialin 9cd508a92a fix: draft model change 2025-11-07 16:54:33 +08:00
jialin 9ffd4def64 fix: failed field auto scroll in view 2025-11-07 16:54:33 +08:00
jialin fdb6ac7575 fix: set page to -1 for all data 2025-11-07 16:54:33 +08:00
jialin 64e2cfa35a fix: auto expand the fields group 2025-11-07 11:56:12 +08:00
jialin 39efca0d4c fix: add loading on download button 2025-11-06 19:38:01 +08:00
jialin cd2942405a feat: cluster_count on dashboard 2025-11-06 19:38:01 +08:00
jialin fadff34f5f chore: update description for adding worker 2025-11-06 19:38:01 +08:00
jialin 7334bcdf83 fix: do not paste multiple lines 2025-11-06 15:37:42 +08:00
jialin e1e38f0404 fix: chat stream data too long 2025-11-06 15:37:42 +08:00
EVGENY Mandjialin 38cc179068 Update backends.ts 2025-11-06 10:25:56 +08:00
EVGENY Mandjialin 5147d0d004 Update clusters.ts 2025-11-06 10:24:55 +08:00
EVGENY Mandjialin c237c9dbde Update models.ts 2025-11-06 10:24:15 +08:00
EVGENY Mandjialin 34bd2c3031 Update resources.ts 2025-11-06 10:23:48 +08:00
jialin 6173f3b459 fix: tts request content-type 2025-11-05 17:09:16 +08:00
jialin 333b430b97 fix(style): do not display draft model after done 2025-11-05 10:02:25 +08:00
jialin 4c22d08da5 refactor: page layout 2025-11-05 10:02:25 +08:00
jialin 219f9871a7 feat: add constants config 2025-11-05 10:02:25 +08:00
jialin 80527d5985 fix: distributed_inference always display 2025-11-04 18:57:57 +08:00
jialin 7e5edd6387 fix: backend option format 2025-11-04 18:07:14 +08:00
jialin 4ca6a221e4 fix: do not show draft model downloading progress 2025-11-04 17:19:20 +08:00
jialin e5733a7f6e chore: add worker notes 2025-11-04 17:19:20 +08:00
jialin 23b7936924 fix: custom backend and versions ux 2025-11-04 13:37:53 +08:00
jialin 9be465a8cf chore: update add worker command 2025-11-04 13:37:53 +08:00
jialin 4bbae673dc fix: draft model local path do not search 2025-11-03 14:22:52 +08:00
jialin e66ee5d3f1 fix: catalog kv cache 2025-11-03 11:00:42 +08:00
jialin 20872100d1 fix: kv cache default value 2025-11-03 10:38:41 +08:00
jialin 06f33ded10 fix: algorithm options do not display 2025-11-03 10:29:32 +08:00
jialin adb5cd72b9 chore: show quant in catalog form 2025-11-03 10:14:30 +08:00
jialin 303429c52c chore: clear space onblur 2025-11-03 10:14:30 +08:00
jialin 1a92cc8543 feat: search draft models from remote 2025-11-03 10:14:30 +08:00
jialin d5cc617848 fix: draft download progress should not show 2025-11-03 10:14:30 +08:00
jialin 4af71b5b52 chore: speculative_config init in updating 2025-11-03 10:14:30 +08:00
jialin 2dab89363d chore: draft model downloading 2025-11-03 10:14:30 +08:00
jialin ab9f9a9679 chore: update reference to baseline 2025-11-03 10:14:30 +08:00
jialin c5166f07f1 style: styles 2025-11-03 10:14:30 +08:00
jialin 86c2f8eda1 fix: backend change 2025-11-03 10:14:30 +08:00
jialin 57d41e79c7 fix: fake spec data 2025-11-03 10:14:30 +08:00
jialin 5cd9b8c22f fix: default spec by mode 2025-11-03 10:14:30 +08:00
jialin 56eba0d4fc fix: default spec by mode 2025-11-03 10:14:30 +08:00
jialin 7936d0063d chore: update models locales 2025-11-03 10:14:30 +08:00
jialin 3613fb3f69 feat: add speculative decoding 2025-11-03 10:14:30 +08:00
jialin 608b2e31c7 fix: schdule type gpu_selctor issue 2025-10-31 17:14:38 +08:00
jialin 2006827968 chore: update extended_kv_cache config 2025-10-31 15:03:23 +08:00
jialin f6a3497b0c fix: do not trigger evaluation replica 0 2025-10-31 13:10:52 +08:00
jialin d7ef64746c fix: custom backend version suffix 2025-10-30 19:08:45 +08:00
jialin b733b3615d fix: remove input box for gpus_per_replica 2025-10-30 16:38:55 +08:00
jialin e9fa3e3aa3 fix: gpus_per_replica appears null 2025-10-30 10:52:48 +08:00
jialin b77f796661 feat: add sglang parameters 2025-10-29 18:56:41 +08:00
jialin c077db1129 fix: replicas trigger compatibility 2025-10-29 17:24:26 +08:00
jialin 801c88a3e2 chore: update --token 2025-10-29 12:11:25 +08:00
jialin 646d235c65 fix: adjust gpus_per_replicas ux 2025-10-28 17:21:22 +08:00
jialin a86bed294e fix: gpu selector issues 2025-10-28 11:17:29 +08:00
jialin 697f1f9c25 fix: built-in backend versions endwith -custom 2025-10-27 16:09:09 +08:00
jialin 61065ee0b7 chore: scheduling group 2025-10-27 14:13:47 +08:00
jialin df65d3e2f6 fix: kv cache support in builtin backend 2025-10-27 14:13:47 +08:00
jialin 6969cb0b9c fix: expand model after edting replicas 2025-10-27 14:13:47 +08:00
jialin 7e81871118 fix: miss cluster id in evaluation 2025-10-24 17:55:54 +08:00
jialin ba80ade643 fix: my models status 2025-10-24 16:11:12 +08:00
jialin 0401cf5fb9 fix: no backend options from model files 2025-10-24 10:18:22 +08:00
jialin 53b431f100 fix(style): add backend 2025-10-23 18:41:16 +08:00
jialin 1a082529c6 fix: skip error handler in root path 2025-10-23 17:09:30 +08:00
jialin bf57290197 fix: admin can not delete own 2025-10-23 17:09:30 +08:00
jialin a815e71bfe chore: show existing when add file 2025-10-23 11:52:49 +08:00
jialin cc0580301e fix: do not trigger evaluation after switching model 2025-10-22 14:28:18 +08:00
jialin 5853bd1eeb fix: builtin backend do not submit default_version 2025-10-22 14:28:18 +08:00
jialin ab93c53092 chore: default cluster by state 2025-10-22 12:13:01 +08:00
jialin 818c4fc9a2 style: form tabs header gap 2025-10-22 10:21:27 +08:00
jialin fc7350b7e2 style: scroll to field 2025-10-21 19:59:49 +08:00
jialin 1e4018350f chore: worker selector 2025-10-21 15:59:48 +08:00
jialin f017d609fb fix: skip user api error 2025-10-21 13:26:06 +08:00
jialin ccb6e72057 fix: textarea scroll bar, deactive count message 2025-10-21 13:24:21 +08:00
EVGENY Mandjialin 32ad9525a6 Update apikeys.ts 2025-10-21 09:30:25 +08:00
EVGENY Mandjialin afedd4337b Update backends.ts 2025-10-21 09:30:06 +08:00
EVGENY Mandjialin 1f7acc7cf6 Update clusters.ts 2025-10-21 09:29:47 +08:00
EVGENY Mandjialin e6a5c19f0b Update menu.ts 2025-10-21 09:29:24 +08:00
EVGENY Mandjialin 8e07302ac3 Update models.ts 2025-10-21 09:29:04 +08:00
EVGENY Mandjialin 0238431b96 Update no-result.ts 2025-10-21 09:28:28 +08:00
jialin 3a7a4ccf30 fix: check driver command for adding worker 2025-10-20 19:11:02 +08:00
jialin 9b843151fe feat: add gpus_per_replicas 2025-10-20 14:53:33 +08:00
jialin 19e275a17a chore: update worker locale 2025-10-17 21:11:31 +08:00
jialin 49c6bb71a1 feat: identicon 2025-10-17 10:15:55 +08:00
jialin 005295ac97 style: gguf model ux 2025-10-17 10:15:55 +08:00
jialin 37a3aa75cc chore: cluster locales 2025-10-17 10:15:55 +08:00
jialin 07243b206e feat: enable kv cache 2025-10-16 18:05:30 +08:00
jialin f732f5c390 fix: cluster issues 2025-10-16 15:05:21 +08:00
jialin 1da16a04fe fix: do not set default version 2025-10-16 15:05:21 +08:00
jialin e2da7c5f96 style: ui for no data in table list 2025-10-16 11:11:39 +08:00
jialin ca9ceda2f7 fix: update backend parameters after changing backend 2025-10-15 13:30:58 +08:00
jialin 059416bb47 fix: backend edit format 2025-10-15 12:18:50 +08:00
jialin 4196351e48 fix: backend edit format 2025-10-15 12:18:50 +08:00
jialin f02b972dc0 fix(styles): my models 2025-10-14 20:09:43 +08:00
jialin 8398ac59a1 style: update model modal type 2025-10-14 20:09:43 +08:00
jialin 83403a1a1a feat: add extended_kv_cache 2025-10-14 20:09:43 +08:00
jialin 620c113fae fix(style): cluster state do not display 2025-10-14 13:09:22 +08:00
jialin 903500dcfa chore: infinite scroller 2025-10-13 19:55:08 +08:00
jialin 68d6993acd chore: remove test dir 2025-10-13 19:55:08 +08:00
jialin 2c9f5062a9 refactor: user table list 2025-10-13 19:55:08 +08:00
jialin d3f39ae06b fix: my models 2025-10-13 15:21:17 +08:00
jialin f42f159785 chore: update locales 2025-10-13 15:21:17 +08:00
jialin bb7c8e9c85 chore: model access statement 2025-10-13 15:21:17 +08:00
jialin 663b6c7b4e style: allowed models ux 2025-10-13 15:21:17 +08:00
jialin 1fa2124efd feat: add allowed models 2025-10-13 15:21:17 +08:00
jialin bcd1a339f9 feat: add model access control 2025-10-13 15:21:17 +08:00
jialin c41e5d9c55 chore: update is_built_in 2025-10-13 14:40:26 +08:00
jialin b5fa40047a chore: pluggable locale config 2025-10-13 14:40:26 +08:00
jialin caabeb065a fix: custom versin configs 2025-10-13 14:40:26 +08:00
jialin d393f9ee9e style: versions config 2025-10-13 14:40:26 +08:00
jialin eb509166ee style: backend list styles 2025-10-13 14:40:26 +08:00
jialin 0dfe77df37 chore: built in versions 2025-10-13 14:40:26 +08:00
jialin 46ecc2467b refactor: advance collapse 2025-10-13 14:40:26 +08:00
jialin a5c1b8e15f chore: test by api 2025-10-13 14:40:26 +08:00
jialin 54703c67c1 feat: yaml editor 2025-10-13 14:40:26 +08:00
jialin e863b84016 feat: add backend pages 2025-10-13 14:40:26 +08:00
jialin 1a693f70ac feat: worker terminal 2025-10-13 14:40:26 +08:00
jialin a9de153c00 chore: deploy form context provider 2025-10-13 14:40:26 +08:00
jialin 42217cf079 feat: add awq,gptq filter 2025-10-13 14:40:26 +08:00
jialin bca1e8140e feat: dynamic backends 2025-10-13 14:40:26 +08:00
jialin ee95fabc47 fix: add worker command miss image 2025-10-09 14:31:59 +08:00
jialin 67552c14af style: user activation 2025-10-09 11:07:09 +08:00
Hugo Haldiandjialin 521bf211a2 feat: add user activation control
- Add is_active field to user model
- Create SealCheckbox component with clickable container
- Add activation control to user modal
- Display user status in users table
- Add localization strings for activation features
2025-10-09 10:11:05 +08:00
EVGENY Mandjialin 8e77e19631 UI: Update Russian language menu.ts 2025-09-24 22:22:46 +08:00
EVGENY Mandjialin 8b91a0546c UI: Update Ru common.ts 2025-09-24 22:22:32 +08:00
EVGENY Mandjialin 715c71f9a5 UI: Update ru models.ts 2025-09-24 22:22:16 +08:00
EVGENY Mandjialin 1ec4a949b8 UI: Update ru playground.ts 2025-09-24 22:22:01 +08:00
EVGENY Mandjialin fc2388093d UI: RU language Update clusters.ts 2025-09-24 22:21:46 +08:00
jialin 3a9bf17d7e chore: update worker, cluster status value 2025-09-23 11:15:43 +08:00
jialin a3002ce450 chore: worker resource info adjust 2025-09-23 11:15:43 +08:00
jialin 2515e8f598 chore: update cloud providers 2025-09-22 10:36:34 +08:00
jialin dcc0db35b5 chore: update k8s check env command 2025-09-22 10:22:23 +08:00
jialin 749adb56f8 fix(style): select gpu vendor 2025-09-19 20:07:13 +08:00
jialin f542ebecb4 fix: cluster value setting, volumes setting 2025-09-19 20:00:25 +08:00
jialin b640963f65 fix(style): my models card 2025-09-19 15:46:24 +08:00
jialin 8f5990c537 fix: register cluster modal 2025-09-18 09:45:46 +08:00
jialin bf400547e1 fix: edit gpu_selector failed 2025-09-17 19:53:40 +08:00
jialin 4d9dec8511 refactor: deploy model 2025-09-17 19:53:40 +08:00
jialin 1ac63e36df feat: add baseSelect 2025-09-17 19:53:40 +08:00
jialin f36613227e fix: os image dropdown list 2025-09-17 15:17:31 +08:00
jialin d063dfd652 chore: display available clusters 2025-09-16 20:32:26 +08:00
jialin c9c9401b0b fix: provder disabled click in k8s 2025-09-16 11:26:17 +08:00
jialin 913f2f5077 fix: menu status mismatch 2025-09-16 11:26:17 +08:00
jialin 336bafd6ce chore: cluster docker provider 2025-09-16 11:26:17 +08:00
jialin 5e1a26b743 fix: close modal after editing cluster 2025-09-16 11:26:17 +08:00
jialin d9d5ca95df style: add worker ux 2025-09-16 11:26:17 +08:00
jialin f1bb305cbc fix: add pool not work 2025-09-16 11:26:17 +08:00
jialin c467280170 fix: display instance type spec 2025-09-16 11:26:17 +08:00
jialin deeee70807 feat: add watch api in cluster 2025-09-16 11:26:17 +08:00
jialin 07ade24ea1 refactor: cluster list 2025-09-16 11:26:17 +08:00
jialin 8de272239e refactor: create cluster by steps 2025-09-16 11:26:17 +08:00
jialin 6e5a7035c8 feat: cloud options 2025-09-16 11:26:17 +08:00
jialin 632f206228 fix: cluster apis 2025-09-16 11:26:17 +08:00
jialin f04f1f828f fix: add do cluster 2025-09-16 11:26:17 +08:00
jialin 4f91443957 chore: upgrade antd lib to 5.25.4 2025-09-16 11:26:17 +08:00
jialin 0c1057d554 refactor: credential table columns 2025-09-16 11:26:17 +08:00
jialin 43936e21d9 feat: instances on worker 2025-09-16 11:26:17 +08:00
jialin 949eded4ee refactor: resource table columns 2025-09-16 11:26:17 +08:00
jialin 84859d1b7c style: cluster table list 2025-09-16 11:26:17 +08:00
jialin 553ec724c2 fix: gpu selector by cluster 2025-09-16 11:26:17 +08:00
jialin 207c90e26c feat: terminal 2025-09-16 11:26:17 +08:00
jialin 64bbba7576 feat: add cluster detail page 2025-09-16 11:26:17 +08:00
jialin 62dbd18ef8 chore: create cluster ux 2025-09-16 11:26:17 +08:00
jialin 55b0a20a4a refactor: update scroll modal 2025-09-16 11:26:17 +08:00
jialin 29b74f85c5 chore: adjust deployment modal form 2025-09-16 11:26:17 +08:00
jialin ed49e03802 feat: cluster ux 2025-09-16 11:26:17 +08:00
jialin 4711c848f8 chore: user mdoels 2025-09-16 11:26:17 +08:00
jialin 33df825b73 feat: add card list component 2025-09-16 11:26:17 +08:00
jialin 89001dbb92 feat: add cluster list 2025-09-16 11:26:17 +08:00
jialin 43e1dd0b0e feat: clusters group 2025-09-16 11:26:17 +08:00
jialin f9cf111a86 chore: vllm docs link 2025-08-20 17:21:01 +08:00
jialin 99f8914830 chore: update vllm arguments 2025-08-20 16:43:48 +08:00
jialin 6da877709d style: display title when sso loading 2025-08-20 16:43:48 +08:00
jialin c4948dc11f fix: sso message 2025-08-19 11:08:15 +08:00
jialin 3f243129a4 fix: do not extract the error message from chat chunk 2025-08-18 18:22:46 +08:00
jialin eb2cae7a77 fix: break early while reading stream data 2025-08-15 19:12:12 +08:00
jialin a2bbcd3939 style: side menu 2025-08-15 15:37:51 +08:00
jialin 0650c4bc26 chore: some sso adjustments 2025-08-15 10:26:24 +08:00
jialin 7c32bf97ae chore: auth-config api 2025-08-14 21:50:59 +08:00
jialin 70aecc1f0c fix: keep storing avatar url when edit external user 2025-08-14 20:28:21 +08:00
jialin 5bd5c7d2c5 feat: add user avatar 2025-08-14 16:39:25 +08:00
jialin d6dce4021d fix: filter non-normal gguf files 2025-08-14 11:03:55 +08:00
jialin ccfdb99348 fix: miss global user info 2025-08-13 20:13:46 +08:00
jialin 2ca712435a fix: markdown view \n do not work 2025-08-13 19:50:54 +08:00
jialin 0af8e34a8f fix: external redirect issue 2025-08-13 19:50:54 +08:00
jialin f2583e152a style: login form style 2025-08-13 16:25:26 +08:00
jialin cf70bd2dc1 refactor: login form based on sso auth 2025-08-13 12:15:16 +08:00
forrestzhouandjialin 8f50af917f feat: Change get_config to auth_config to make it more specific 2025-08-12 17:19:04 +08:00
forrestzhouandjialin 4bdde365cf add sso login logic 2025-08-12 17:19:04 +08:00
forrestzhouandjialin 7f1bc33eed first push 0.7 2025-08-12 17:19:04 +08:00
jialin d0d24aba4e fix: markdown viewer white-space: pre-line 2025-08-12 16:45:50 +08:00
EVGENY Mandjialin 0d68c0d683 Update menu.ts 2025-08-12 00:15:14 +08:00
jialin e1ab735823 perf: toggle theme too much render in catalog 2025-08-11 09:35:01 +08:00
jialin bb67a8cbbb chore: display downloading progress in model instance log 2025-08-08 15:51:09 +08:00
jialin c8a7ac7dc6 style: keep text wrap for evalution result 2025-08-05 15:57:35 +08:00
EVGENY Mandjialin 788a294200 Update menu.ts 2025-07-31 09:38:00 +08:00
EVGENY Mandjialin f34935a634 Update models.ts 2025-07-31 09:36:50 +08:00
EVGENY Mandjialin a7331256fc Update dashboard.ts 2025-07-31 09:36:21 +08:00
jialin 8fa3941db9 fix: do not evaluate when local path is null 2025-07-30 11:12:13 +08:00
jialin ada120c1b9 fix: the theme align with the system 2025-07-30 11:12:13 +08:00
jialin 72f7168893 fix: adjust precision for big size 2025-07-29 18:40:29 +08:00
jialin 75b70a26bd fix: download log failed 2025-07-25 11:26:09 +08:00
jialin 4433e5d8e5 chore: move favicon icon to root 2025-07-23 16:02:58 +08:00
jialin 351b2e1417 chore: adjust the evaluation result statement 2025-07-23 11:13:37 +08:00
jialin 3c7dc5a49e fix: update the instance servers field 2025-07-22 19:26:08 +08:00
jialin 9895231696 fix: miss model category、name on catalog page 2025-07-21 19:51:30 +08:00
jialin 3fa3281c51 fix: progress bar default open 2025-07-18 15:12:18 +08:00
jialin bbf11d0374 style: model file status cell size 2025-07-18 10:35:35 +08:00
jialin 04ee696f6a style: playground bold text 2025-07-17 17:26:34 +08:00
jialin ddbbe92a85 chore: show used vram for a second 2025-07-17 12:01:49 +08:00
jialin 32ba5e1802 fix(style): axis tick value too long 2025-07-16 16:33:22 +08:00
jialin a1c6eb177a chore: remove autoplay for audio and video 2025-07-16 14:38:37 +08:00
jialin 14d60264c7 fix: wav format audio, #2317 2025-07-16 13:06:01 +08:00
jialin f4d6abace7 fix: remove insert action for watching, #2504 2025-07-15 19:33:04 +08:00
jialin a5e1717138 chore: update mindie backend parameters 2025-07-15 15:21:26 +08:00
jialin 472a4d400b chore: installer download link 2025-07-14 17:01:11 +08:00
jialin fda4786737 fix: set null to filename for download non-gguf 2025-07-11 11:07:54 +08:00
jialin c3686579b2 chore: add worker statements 2025-07-11 10:09:01 +08:00
jialin f2dfb2f32d style: uniform margin top for resources pages 2025-07-11 10:09:01 +08:00
jialin 60ee9f1a15 fix: catalog jump to deployments route error 2025-07-10 17:50:21 +08:00
jialin f43d1af6a7 fix(style): menu item text wrap 2025-07-10 15:24:55 +08:00
jialin b631b4c7b7 chore: remove menu data render 2025-07-10 14:52:08 +08:00
jialin e3aba0529f chore: update iconfont files 2025-07-10 10:02:10 +08:00
jialin cf682feae9 fix: menu items for user role 2025-07-10 10:02:10 +08:00
jialin 03d798760c chore: add worker guide 2025-07-10 09:47:12 +08:00
jialin 51450c2b02 style: flatten menu items 2025-07-10 09:47:12 +08:00
EVGENY Mandjialin 751ddbb3f3 Update resources.ts 2025-07-10 09:44:00 +08:00
EVGENY Mandjialin 36b3620d0c Update common.ts 2025-07-10 09:43:16 +08:00
jialin fd3eb513ff chore: update the guide for adding worker 2025-07-09 16:03:07 +08:00
jialin af0aaddbfd fix: update the requestId when switch model 2025-07-09 16:03:07 +08:00
jialin b167170aa9 style: tag tooltip content width 2025-07-09 16:03:07 +08:00
jialin 642ac3ebc4 fix: reset form after switch model 2025-07-07 17:40:09 +08:00
jialin 69cceb4fc7 refactor: update user guide for add worker
chore: update resource locales
2025-07-07 17:40:09 +08:00
jialin ac32e23e87 fix: distributed inference across workers disabled for vox-box 2025-07-04 20:57:57 +08:00
jialin 04de4ff606 fix: enable distributed inference field for mindie 2025-07-04 19:56:47 +08:00
jialin 27761566c9 fix: collpase instance error 2025-07-04 17:49:17 +08:00
jialin 3d93eda92d fix: distribution downloading data do not show 2025-07-04 16:45:15 +08:00
jialin 6943571a6d fix: images did not get cleared after clicking stop 2025-07-04 15:42:03 +08:00
jialin 28994cb9da chore: add iluvatar corex in add worker 2025-07-04 15:42:03 +08:00
jialin 5866634b3f chore: update iconfont files 2025-07-03 11:38:19 +08:00
jialin e3d91f1cc7 style: source icon in model result list 2025-07-03 11:38:19 +08:00
jialin 8ac06259f5 fix: do nothing when clicking the selected model or file 2025-07-03 10:41:22 +08:00
jialin c8933a6669 fix: update form values when switching model、size, #2191 2025-07-02 20:34:48 +08:00
jialin 6c2da264db fix: image generating flickering, #1415 2025-07-02 19:33:33 +08:00
jialin 993f01a301 fix: multiple select ux 2025-07-02 11:39:54 +08:00
jialin 9e29e7283c feat: add simple select component 2025-07-01 20:20:50 +08:00
jialin 7da106798d fix: some fields value do not be updated from default spec 2025-06-30 20:10:20 +08:00
jialin b2e9cbb44a chore: update backend parameters and logs reading frequency 2025-06-30 18:57:13 +08:00
jialin 143f6df2c1 perf: do not handle ansi sequence for parsing logs 2025-06-30 17:07:29 +08:00
jialin a64505fcc1 chore: update mindie parameters 2025-06-29 16:43:03 +08:00
jialin 0aaf919827 fix: switch model clear backend_parameters, env, backend_version 2025-06-27 18:07:30 +08:00
jialin bf8e988488 style: top users chart compact 2025-06-27 17:26:34 +08:00
jialin d26ea28028 fix(style): top users bar name too long 2025-06-27 16:42:24 +08:00
jialin abdd5e08a6 fix(style): top users bar name too long 2025-06-27 16:38:19 +08:00
jialin 47a5ef915b fix: pick backend_parameter, env, backend_version from spec in catalog 2025-06-27 16:38:19 +08:00
jialin 5861508153 fix(style): imgs overflow style on chat 2025-06-27 13:43:40 +08:00
jialin 85754ccfb5 fix(style): chart grid right margin 2025-06-27 10:53:51 +08:00
jialin cbeea23295 style: keep the logs pagination visible 2025-06-27 10:15:11 +08:00
jialin e2d79a6802 style: multiple selection tag 2025-06-26 20:39:07 +08:00
jialin c68d85096b fix(style): usage reponse size 2025-06-26 15:54:59 +08:00
jialin fcafa83111 fix: split line align for two yAxis chart 2025-06-26 15:54:59 +08:00
jialin 47d7418eb1 fix: usage: datepicker item disabled issue 2025-06-26 12:15:09 +08:00
jialin 8751400ae3 fix: distributed servers info 2025-06-25 20:29:48 +08:00
jialin 3889c1fa71 fix: reranker item uid updated, chat image size issue, #2280 2025-06-25 16:49:46 +08:00
jialin a4d1d3b16c style: skeleton for search result 2025-06-25 14:35:00 +08:00
jialin adfdf41e85 fix: do not check the required fields for evaluation, #2191 2025-06-25 14:35:00 +08:00
jialin a6825f7ee3 feat: clean markdown content 2025-06-25 14:35:00 +08:00
jialin 830ee45161 fix: update evaluation result issue 2025-06-24 20:47:27 +08:00
jialin 5f7df3f871 chore: update usage api 2025-06-24 16:54:03 +08:00
jialin 34af730934 feat: model usage 2025-06-24 16:54:03 +08:00
jialin 645801fe86 chore: mindle multiple support 2025-06-23 20:23:05 +08:00
jialin 547f49a978 fix: audio uploader has cache issue 2025-06-23 16:25:22 +08:00
jialin fd3d7a6f29 style: side menu style 2025-06-23 15:13:49 +08:00
jialin 6be7140a47 fix: #2227, #2263 2025-06-20 19:34:04 +08:00
jialin ca7dc02d88 revert: markdown katex parse 2025-06-20 11:18:18 +08:00
jialin 1924c45358 fix: chat request payload error, #2163 2025-06-20 11:18:18 +08:00
jialin be92f92991 fix: for gguf ref not be created, #2227 2025-06-19 15:25:21 +08:00
jialin a9b909cca1 fix: upload a audio will clear imgs, #2163 2025-06-19 13:36:49 +08:00
jialin 175b83dd68 fix: #2191,#2227 2025-06-19 13:36:49 +08:00
jialin df85284a60 style: audio player, usage chart 2025-06-19 13:36:49 +08:00
jialin 17ffa93393 fix: do not modify the custom name 2025-06-18 17:56:19 +08:00
jialin 73c525127f fix(style): simple audio player 2025-06-18 17:45:58 +08:00
jialin 3e76d7c321 fix: embedding params escape 2025-06-18 15:03:35 +08:00
jialin 9295f9cef3 fix: sync and update the evaluation result 2025-06-18 11:48:09 +08:00
jialin 9d1e6df8f0 chore: date ranger picker presets 2025-06-18 11:48:09 +08:00
jialin 0805d70c07 style: usage download button 2025-06-17 16:17:26 +08:00
jialin 0133524f09 fix: debounce for page change in search models 2025-06-17 11:50:33 +08:00
EVGENY Mandjialin 2c5100b2ed Update common.ts 2025-06-17 09:50:38 +08:00
EVGENY Mandjialin 51296cdc15 Update dashboard.ts 2025-06-17 09:50:14 +08:00
EVGENY Mandjialin f261bec248 Update users.ts 2025-06-17 09:49:54 +08:00
jialin 97c7087f6c fix(style): esc hint flickering 2025-06-16 19:54:23 +08:00
jialin 109906d083 fix: usage chart y axis ticks, add esc hint for drawer 2025-06-16 19:28:02 +08:00
jialin 81833c4938 fix: update gpus state by polling 2025-06-12 17:26:34 +08:00
jialin 1b6cfdbdc4 fix: evaluate status add lock state 2025-06-12 09:57:25 +08:00
jialin 281d8bddc1 feat: add pagination for searching models 2025-06-10 19:24:13 +08:00
jialin 0eaa3aeeb7 fix: do not undo when is inverting 2025-06-09 19:39:27 +08:00
jialin 4dcb0bcfed fix: image editor fit view incorrect, do not query gguf files when gguf unchecked 2025-06-09 18:45:47 +08:00
jialin e69b7dfd6a Revert "fix: normaliza embedding data"
This reverts commit 2bfb93a063.
2025-06-09 18:45:47 +08:00
jialin 38d63c71ee fix: normaliza embedding data 2025-06-09 18:45:47 +08:00
jialin 6880fd3f5f fix: user settings locales 2025-06-09 18:45:47 +08:00
jialin 1771ca363a fix: show embedding token usage 2025-06-09 18:45:47 +08:00
jialin c896c88c23 chore: remove ollama model source 2025-06-09 18:45:47 +08:00
jialin 5ef733729b fix: ui conflicts in update of multiple evalute result 2025-06-09 18:45:47 +08:00
jialin f73e29937c chore: export table title 2025-06-09 18:45:47 +08:00
jialin 8383547943 style: simple audio player 2025-06-09 18:45:47 +08:00
jialin 8070d3f1e6 style: usage chart style 2025-06-09 18:45:47 +08:00
jialin a161fa953e feat: usage export data 2025-06-09 18:45:47 +08:00
jialin 471e1ae96f feat: upload audio file in chat 2025-06-03 19:58:08 +08:00
jialin ed28bcdfb0 fix: set default spec to form 2025-06-03 15:16:52 +08:00
gitlawr 31ea81c211 ci: publish v*-dev branches 2025-05-30 14:02:56 +08:00
jialin 283189a17c fix: model instances always update by cache 2025-05-30 11:23:25 +08:00
jialin 40020df865 fix: clear backend parameters when change model file 2025-05-29 11:32:23 +08:00
jialin aa6b5ec24f fix: refresh model list manually 2025-05-28 17:25:23 +08:00
jialin f53fe042a9 fix: update allChildren after stop or start 2025-05-28 14:41:35 +08:00
jialin 034a54bf4b chore: model file components for updating 2025-05-27 19:45:24 +08:00
jialin 894dd1e353 chore: update mindie parameters 2025-05-27 16:50:08 +08:00
jialin ca99db5a97 chore: show llm code with common component 2025-05-27 16:50:08 +08:00
jialin 61e506010c fix: pca calculating takes a long time 2025-05-26 19:56:51 +08:00
jialin 4b4343a9fd chore: add watch for worker and gpu updating 2025-05-26 16:17:17 +08:00
jialin 9efacefba3 fix: remove worker-loader 2025-05-25 19:45:57 +08:00
jialin f288c9a9ad perf: embedding calc in worker process 2025-05-25 11:15:50 +08:00
jialin ec45f23485 chore: adjust the delay for scroller 2025-05-20 19:33:10 +08:00
jialin 1c11e73ff8 fix: playground parameters area resizable 2025-05-20 19:33:10 +08:00
EVGENY Mandjialin 174f93fe11 Update common.ts 2025-05-17 22:21:40 +08:00
jialin 6340f1fb54 fix: refresh selection after deleting by batch 2025-05-16 16:07:55 +08:00
jialin febdc5b8e2 fix: add delete action for table watch 2025-05-16 11:51:07 +08:00
jialin b5044b8753 fix: clear query do not trigger a search 2025-05-16 10:10:03 +08:00
jialin 00a60b8948 chore: update error components for loading file failed 2025-05-15 22:57:24 +08:00
jialin 17ec70f839 chore: init mask theme 2025-05-15 19:04:40 +08:00
jialin ac03a93c64 chore: add dark mask, remove clear button in audio and image 2025-05-15 18:02:07 +08:00
jialin 5e8692eae5 fix: theme setting miss after refreshing 2025-05-15 11:53:10 +08:00
jialin 2e56e93d83 fix(style): rerank text overlap 2025-05-14 22:34:39 +08:00
jialin 11d0ff2ec3 chore: update iconfont files 2025-05-14 22:19:27 +08:00
jialin 8a59025132 fix: theme setting in login 2025-05-14 22:19:27 +08:00
jialin 5488a8ea82 fix: system theme 2025-05-14 20:13:54 +08:00
jialin 18cb82a0fe chore: preview field use switch 2025-05-14 14:54:32 +08:00
jialin f951358db4 fix: stop thinking when loading end 2025-05-13 20:29:32 +08:00
jialin a23162117c fix: remember me not worke in login 2025-05-13 20:29:32 +08:00
jialin b13e7b89e2 fix(style): downloading popover 2025-05-12 19:16:29 +08:00
jialin 2416fd1c71 fix: add version holder for backend 2025-05-12 15:13:44 +08:00
jialin 2b7eb832ed fix: remove evaluating for files 2025-05-12 15:13:44 +08:00
jialin 1532f47da1 fix: avoid sending all files when evaluating 2025-05-09 19:33:50 +08:00
jialin 2fa20de631 fix: message format with imgs, downloading table style 2025-05-09 15:59:24 +08:00
EVGENY Mandjialin b51e16bba8 Update models.ts 2025-05-09 09:32:14 +08:00
EVGENY Mandjialin 8ae6c4fd7a Update common.ts 2025-05-09 09:32:00 +08:00
jialin 53b51f0740 fix: remove all the slashes at the end 2025-05-08 20:36:34 +08:00
jialin 92b4be90d0 fix: wrong header content-type for curl tts 2025-05-08 18:25:53 +08:00
jialin 80a6658769 chore: update iconfont files 2025-05-08 18:25:53 +08:00
jialin f0f4bd8bf2 style: login modal 2025-05-08 15:22:53 +08:00
jialin e05b323489 chore: add some arguments for mindie 2025-05-08 11:20:25 +08:00
jialin 7f198b64f1 chore: ollama deprecated tips 2025-05-08 11:09:05 +08:00
jialin 1c87fef28d fix: fetch list page more than total page 2025-05-07 16:34:12 +08:00
jialin 816c22979f chore: catalog: scroll to load more data 2025-05-07 16:34:12 +08:00
jialin 42f9a27851 style: remove bg image in login 2025-05-06 20:19:19 +08:00
jialin 6a2d2dfdaf fix: ignore the fields when compare data 2025-05-06 17:42:14 +08:00
jialin efd2088745 style: login page dark style 2025-05-06 17:42:14 +08:00
jialin 56e8e84eaf fix: gpu selector sort 2025-05-06 13:19:06 +08:00
jialin eccebae596 chore: format message content by list 2025-04-30 19:25:06 +08:00
jialin edc36283d9 chore: doc link in compatible message 2025-04-30 19:25:06 +08:00
jialin 2409cfefc9 fix: form values check incorrect 2025-04-30 17:38:15 +08:00
jialin fae73913de style: gauge dark style 2025-04-30 17:38:15 +08:00
jialin 69f398c594 fix: update fields value 2025-04-30 14:56:34 +08:00
jialin fe52238ac2 chore: error handler in stream response 2025-04-30 12:26:37 +08:00
jialin a3501e5417 fix: update form value trigger tips 2025-04-30 11:01:14 +08:00
jialin 52add26905 style: login background 2025-04-29 18:27:38 +08:00
jialin 954b034b8b fix(style): dark style 2025-04-29 18:05:43 +08:00
jialin e5aa5ace15 chore: remove invalid files 2025-04-29 18:05:43 +08:00
EVGENY Mandjialin a6c5ec8581 Update common.ts 2025-04-29 09:35:39 +08:00
jialin beb395ce32 fix(style): global theme settings in login 2025-04-28 18:22:05 +08:00
jialin bcfa80a2d5 chore: remove custom ui 2025-04-28 10:05:06 +08:00
jialin 96e5398ad1 fix(style): dark css vars 2025-04-28 10:05:06 +08:00
jialin 4b748ee43a style: overlay scroller 2025-04-28 10:05:06 +08:00
jialin 838e0f9910 style: code viewer 2025-04-28 10:05:06 +08:00
jialin 548e1378f5 feat: add ThemeTag 2025-04-28 10:05:06 +08:00
jialin fb90d79eb3 chore: custom brand color 2025-04-28 10:05:06 +08:00
jialin 3fb3381a19 style: ajust dark theme 2025-04-28 10:05:06 +08:00
jialin 60d0750695 style: dark theme for scroller 2025-04-28 10:05:06 +08:00
jialin ce9c31f368 chore: dark config 2025-04-28 10:05:06 +08:00
jialin d4d7148f16 fix: create image custom size do not work 2025-04-27 10:51:13 +08:00
jialin b5aba6e007 style: distribution info table word wrap 2025-04-24 23:13:47 +08:00
jialin 2564fa7382 style: distribution info for vllm 2025-04-24 22:47:53 +08:00
jialin c07be7386c revert: remove evaluation loading 2025-04-24 22:17:49 +08:00
jialin c400003ce9 fix: model and file evaluate over close loading 2025-04-24 21:15:42 +08:00
jialin d4ffd8e8e4 fix: do not close loading when evaluating 2025-04-24 20:36:34 +08:00
jialin 9a6b907c11 chore: check default backend deploy from local path 2025-04-24 18:09:54 +08:00
jialin 84d4c7a6f2 chore: do not change the backend in local_path 2025-04-24 17:28:25 +08:00
jialin 0497e2052d fix: audio model use voxbox only 2025-04-24 17:23:25 +08:00
jialin dc8e9e3fef fix: gpus empty 2025-04-24 16:13:58 +08:00
jialin 518a593c2a fix: gpuoptions empty 2025-04-24 16:11:04 +08:00
jialin f7168cc814 fix: quant fp16 first in catalog 2025-04-24 15:49:08 +08:00
jialin 18217dadc3 chore: set mindie to backend in ascend 2025-04-24 15:06:16 +08:00
jialin 559a4969c1 fix: dashboard usage display datas for last 30 days 2025-04-24 12:43:55 +08:00
jialin 7bad6cd20a chore: display the error message of request header 2025-04-23 19:50:58 +08:00
jialin e3987c8aa3 chore: usage data 2025-04-23 16:39:32 +08:00
jialin a46286872d fix: accept image in edit page 2025-04-23 15:51:48 +08:00
jialin 9bb7a125e3 chore: adjust the date range for usage 2025-04-23 14:24:13 +08:00
jialin 3c196abccb style: format large number for chart label 2025-04-23 10:52:00 +08:00
jialin 2e8899dfef chore: remove qwq in ollama options 2025-04-22 19:57:32 +08:00
jialin 8337768c5a fix: check the error type and return as string 2025-04-22 17:03:24 +08:00
jialin 034b371ad4 fix: handle error as string when mismatch the field 2025-04-22 16:51:05 +08:00
jialin 1e68b75c68 chore: stop scrolling when wheeling in chat page 2025-04-22 16:07:44 +08:00
jialin ac1bf7c9bf style: parameter popover maxheight 2025-04-21 20:23:14 +08:00
jialin d60e052f05 fix: do not expand the instance list when request is pending 2025-04-21 18:18:23 +08:00
jialin 43b71c7532 style: bold text 2025-04-21 09:51:56 +08:00
Shion Tanakaandjialin 8ee0a99323 fix: update ja-JP 2025-04-21 09:36:56 +08:00
jialin 50febc342c fix: install command is incorrect after switching 310p 2025-04-18 20:48:24 +08:00
jialin c98667245e chore: update faq link 2025-04-18 20:16:41 +08:00
jialin 76fdf8e501 chore: update storage path holder text 2025-04-18 17:15:18 +08:00
jialin 6270226ead chore: avoid repeat rendering for clicking same image 2025-04-18 15:13:51 +08:00
jialin ed5afff5d7 fix: save mask on initial 2025-04-18 14:40:26 +08:00
jialin 5d8d38bdf0 fix: clear token usage when stoping chat 2025-04-18 11:16:48 +08:00
EVGENY Mandjialin 88af879d31 Update models.ts 2025-04-18 09:30:07 +08:00
EVGENY Mandjialin 91095f14fb Update resources.ts 2025-04-18 09:29:40 +08:00
jialin 65077088b6 fix: handle api error 2025-04-17 17:58:51 +08:00
jialin 47666b7193 fix: handle api error 2025-04-17 17:58:51 +08:00
jialin 353f73ed0b fix: set llamabox to backend for local gguf file 2025-04-17 14:56:49 +08:00
jialin 51ed9dab04 chore: disabled across workers for mindie 2025-04-17 12:34:53 +08:00
jialin c8b0faf05d style: model file source tooltip 2025-04-17 11:55:19 +08:00
jialin 3d7609e3f5 style: chat role 2025-04-16 20:16:26 +08:00
jialin d9611948d7 chore: evaluate error message 2025-04-16 18:02:59 +08:00
jialin 67053db9ba fix(style): api access info modal with 2025-04-16 15:16:31 +08:00
jialin c831c19848 chore: update vllm parameters, do not change backend when file type unknown 2025-04-16 12:34:18 +08:00
jialin ced45bec65 style: overflow layer padding 2025-04-15 11:08:01 +08:00
EVGENY Mandjialin 13ded5595a Update models.ts 2025-04-15 09:28:13 +08:00
EVGENY Mandjialin dfc4a8d713 Update playground.ts 2025-04-15 09:27:41 +08:00
EVGENY Mandjialin 31b9bfa590 Update resources.ts 2025-04-15 09:27:18 +08:00
jialin f93b3c7424 fix(style): see flickering in tooltip overflow dom 2025-04-14 20:39:38 +08:00
jialin 3d32ec7210 chore: allow switch backend between vllm and mindie 2025-04-14 19:29:55 +08:00
jialin b108d4e287 fix(style): tooltip overflow 2025-04-14 16:59:43 +08:00
jialin d8ea86fde1 chore: backend description 2025-04-14 14:08:59 +08:00
jialin 58e979bc45 chore: remove first login ux 2025-04-14 10:37:00 +08:00
jialin d5acf92f8a fix: description consistency 2025-04-14 09:34:16 +08:00
jialin ddd9b9ae97 chore: add parameter --truncation 2025-04-12 11:54:50 +08:00
jialin f77bf37be8 chore: init max tokens for mindie models 2025-04-12 11:48:02 +08:00
jialin fb8fcc5028 fix: set env null after change backend 2025-04-11 20:27:30 +08:00
jialin f80daf6cd4 fix: extra button control 2025-04-11 20:02:39 +08:00
jialin 092aeceb9d chore: clear backend parameters、backend_version、env on change backend 2025-04-11 18:49:06 +08:00
jialin 7542ac9d87 style: hidden expand button when no replicas 2025-04-11 18:49:06 +08:00
jialin b27ebaaccf chore: update iconfont static files 2025-04-11 12:16:35 +08:00
jialin 5b20a7edb8 fix: disabled across_workers for vllm in edit 2025-04-10 17:52:04 +08:00
jialin 48580cb5b0 feat: add api access info modal 2025-04-10 17:30:26 +08:00
jialin 7c79accda7 chore: display warning message after form change in edit model 2025-04-10 12:21:55 +08:00
jialin 1182fdeb43 chore: add backend field in check api 2025-04-09 18:43:42 +08:00
jialin 694ffb0a81 style: add model selection tips in playground 2025-04-09 17:46:18 +08:00
jialin fe8ff2b180 chore: npu ux for add worker 2025-04-09 15:46:30 +08:00
jialin ade1db5215 fix: omit distribution and cpu_offload fields from default spec 2025-04-08 20:58:24 +08:00
jialin 5269cbf862 fix: submit button is incorrect in edit model 2025-04-08 19:44:59 +08:00
jialin d62e43790c chore: extract a model file item 2025-04-08 19:19:41 +08:00
jialin 5766a50bc2 chore: add changes tips 2025-04-08 16:33:19 +08:00
jialin c09503aad8 fix: add backend field in evaluation payload 2025-04-08 14:37:31 +08:00
jialin f6bc183972 fix(style): unify casing of system terms 2025-04-08 13:28:13 +08:00
jialin a087677c6e chore: allow to config distribution in vllm 2025-04-08 09:47:10 +08:00
jialin 529a2ecd81 fix: validate gpu_selector value before check 2025-04-07 20:04:40 +08:00
jialin 3843d1bd3e fix: ollama model change trigger check action 2025-04-07 19:49:37 +08:00
jialin 6be7f6ad68 style: worker filter bar 2025-04-07 19:49:37 +08:00
jialin 30c4fb8032 fix: auto-complete width 2025-04-07 17:10:05 +08:00
jialin a7dee45720 fix: image edit invert mask 2025-04-07 17:10:05 +08:00
jialin f7c597d957 style: shortcut for start to search model 2025-04-07 13:38:53 +08:00
jialin b89e7c6c3d style: form components 2025-04-07 11:51:34 +08:00
jialin 0f7a619a34 chore: add mindie option 2025-04-07 10:31:22 +08:00
jialin 5c1cb120e1 fix: reset some fields for default spec 2025-04-07 10:08:56 +08:00
jialin 9f24e765be fix: check compatiblity after delete selecor 2025-04-05 10:42:24 +08:00
jialin a23f9881ee fix: some fields value are null after select model 2025-04-03 20:42:20 +08:00
EVGENY Mandjialin 80e85a571e Update resources.ts 2025-04-03 20:40:24 +08:00
EVGENY Mandjialin 82a412093e Update models.ts 2025-04-03 20:40:08 +08:00
EVGENY Mandjialin 8986e84dfe Update common.ts 2025-04-03 20:39:53 +08:00
jialin b6136a092d fix: the fields for trigger checking 2025-04-03 18:08:43 +08:00
jialin 939f46c7e6 fix: miss gpu_selector value in catalog 2025-04-03 13:36:09 +08:00
jialin dd8059693d fix: voice list do not be shown 2025-04-02 21:11:50 +08:00
jialin afacd2a8a0 fix: check form data after blur 2025-04-02 20:40:57 +08:00
jialin 4755cf6a25 fix: do not display modelscope source 2025-04-02 17:55:10 +08:00
jialin d3e58c85cf fix: categories value error 2025-04-02 17:55:10 +08:00
jialin 89a6d6a4c1 chore: update add worker command for container 2025-04-02 15:48:46 +08:00
jialin ecbfeb608b fix: can not select voxbox in editing 2025-04-02 14:50:21 +08:00
jialin f8a8314476 chore: check configuration on initial and change values 2025-04-02 14:19:06 +08:00
jialin b1d7bb9fd7 fix: backend is not updated after changing model 2025-04-02 11:24:26 +08:00
EVGENY Mandjialin 28a84a90cf Update resources.ts 2025-04-02 09:22:03 +08:00
EVGENY Mandjialin 067119eac7 Update models.ts 2025-04-02 09:21:27 +08:00
jialin 3fa19cf977 fix: submit form data error 2025-04-01 22:53:25 +08:00
jialin 5cbb5e7d40 style: check compatibility 2025-04-01 20:47:52 +08:00
jialin f5c4749954 chore: check compatibility in edit 2025-04-01 20:47:52 +08:00
jialin a3ee010286 fix: visit auto playground error from model list 2025-04-01 13:58:50 +08:00
jialin 7e8b5f1f63 fix: model filter by worker 2025-04-01 10:56:50 +08:00
jialin eff88528d3 chore: restart on error 2025-03-31 16:21:40 +08:00
jialin f83e49bd3d chore: check compatibility ux 2025-03-31 16:21:40 +08:00
jialin bd6c689d91 chore: compatibility api 2025-03-31 16:21:40 +08:00
jialin f9469a1ea3 fix(style): message toast bgcolor 2025-03-29 21:35:24 +08:00
jialin c0d92fbdd5 chore: add check locales keys 2025-03-28 19:15:57 +08:00
jialin 2079fc1801 fix(style): add worker 2025-03-28 19:15:57 +08:00
jialin 59d01a6bd9 style: table list col span 2025-03-28 19:15:57 +08:00
Shion Tanakaandjialin 4f29fe5040 feat: Add Japanese Language 2025-03-28 15:03:37 +08:00
jialin 455ae8aa05 style(font): font size 14 2025-03-27 18:32:44 +08:00
jialin db417e6a5f style: set theme token 2025-03-27 18:32:44 +08:00
jialin 8d444f24f8 style: table list col span 2025-03-27 16:11:49 +08:00
jialin 618cd667fc feat: row, col component 2025-03-27 16:11:49 +08:00
jialin f4d5419ba1 style: table style 2025-03-27 16:11:49 +08:00
jialin 0d80269e2d fix: windows path style 2025-03-27 12:17:52 +08:00
jialin 861e95673d fix: resource do not display in model files 2025-03-26 19:08:10 +08:00
jialin 997e4a1edd chore: cache resources active tab 2025-03-26 17:31:31 +08:00
jialin bfdf02f065 fix: copy patn button flickering 2025-03-26 17:31:31 +08:00
jialin f658b9d6d9 style: downloading progress 2025-03-26 11:59:49 +08:00
jialin 671fce2961 chore: cleanup file checkbox 2025-03-26 11:59:49 +08:00
EVGENY Mandjialin 93c9ffe109 Update models.ts
update ru
2025-03-26 10:00:04 +08:00
EVGENY Mandjialin 17cd414dde Update resources.ts
update ru
2025-03-26 09:58:33 +08:00
jialin 3bc10291c4 chore: set source as local_path deploy from model files 2025-03-25 21:24:03 +08:00
jialin 8f6c1d0e47 chore: init worker selector 2025-03-25 17:58:01 +08:00
jialin f882fe2c32 fix: deploy from model files source incorrect 2025-03-25 16:39:03 +08:00
jialin b25644c590 chore: worker downloading tooltip 2025-03-25 12:33:29 +08:00
jialin 626e29a001 style: form item style 2025-03-25 12:33:29 +08:00
jialin dca7a6f270 chore: add model file ux 2025-03-25 12:33:29 +08:00
jialin 05ef2b8eaa chore: add model api 2025-03-25 12:33:29 +08:00
jialin 1819649a3a style: backend check info 2025-03-20 12:16:46 +08:00
jialin b8f58b2cc1 fix: can not paste a text in env vars input box 2025-03-19 20:09:43 +08:00
jialin 2ceefab18c feat: download model 2025-03-19 20:09:43 +08:00
jialin 254dd75cd0 style: instance offload info 2025-03-19 11:43:52 +08:00
jialin 6e87d66932 chore: pasted multiple lines in env vars 2025-03-19 11:23:29 +08:00
jialin 3a05d74a36 fix: no undef var error 2025-03-19 11:23:29 +08:00
jialin 4b5f08ccc2 chore: add delete action in table fetch hook 2025-03-19 09:29:31 +08:00
EVGENY Mandjialin cc20050dc8 Update models.ts
update ru
2025-03-18 23:51:40 +08:00
jialin 25cf439f03 chore: extract fetch hooks for common table 2025-03-18 20:35:29 +08:00
EVGENY Mandjialin 2beae9ea5b Update playground.ts
update translation playground.chat.thinking
2025-03-18 18:08:33 +08:00
EVGENY Mandjialin 64a1ab5c60 Update playground.ts
Update RU
2025-03-18 17:19:38 +08:00
jialin 00ef7ab6ca fix: edit mask for undo 2025-03-18 17:15:55 +08:00
jialin 08b3c9d1ac fix: remove TODO tips in locales 2025-03-17 20:25:03 +08:00
jialin 2287196746 chore: load mask by pix 2025-03-17 20:25:03 +08:00
jialin 9ac679d437 fix: block body scroll when view version 2025-03-14 19:40:15 +08:00
jialin db0a5875fa fix: show success message when start model falied 2025-03-14 18:50:45 +08:00
jialin 38ff16f3cd fix(style): always display offloads info 2025-03-14 16:43:36 +08:00
jialin ccbc36f991 fix: do not call models watch after first loading 2025-03-14 16:43:36 +08:00
jialin b47b99bd28 fix: cpu offloads do not display 2025-03-14 10:22:23 +08:00
jialin 55a922427b fix: cot button can not operate 2025-03-13 21:11:53 +08:00
jialin a5525c065c style: chat message render markdown by default 2025-03-13 18:49:20 +08:00
EVGENY Mandjialin 840b3c2a84 Update common.ts
Update RU
2025-03-13 11:11:59 +08:00
EVGENY Mandjialin 3cef5f0bff Update models.ts
Update ru
2025-03-13 11:11:46 +08:00
jialin fa1463939e chore: verfiy docs 2025-03-12 18:47:46 +08:00
jialin b31099c94d chore: update the llamabox backend tips 2025-03-12 18:40:10 +08:00
jialin fc0899d9d3 fix: do not get the backend when local path blur 2025-03-12 17:41:38 +08:00
jialin a7170a4eee chore: merge fetch data request 2025-03-12 16:53:43 +08:00
jialin e04874d074 fix: remove test code 2025-03-12 10:57:29 +08:00
jialin 0fc570b138 chore: the backend matches the model file 2025-03-12 10:43:59 +08:00
jialin 5edbc1a7b5 style: model list buttons 2025-03-12 10:43:59 +08:00
jialin a7cfa05504 fix: markdown word bread 2025-03-10 17:40:55 +08:00
jialin c0988da176 fix: image viewer flick 2025-03-10 17:11:32 +08:00
jialin 12707793b1 chore: display vllm distributed info 2025-03-10 15:11:48 +08:00
jialin 06d6732ab2 docs: update readme.md 2025-03-10 12:33:43 +08:00
jialin ab6e98aae2 chore: press enter to submit chat message 2025-03-09 21:31:58 +08:00
jialin a2ef9d781d chore: display instance resource claim 2025-03-07 17:07:40 +08:00
jialin 106ee43171 fix: base64 convert to file for all image type 2025-03-06 20:27:34 +08:00
jialin 36d626c833 chore: ram vram usage in resource 2025-03-06 19:44:35 +08:00
jialin b0ac85d81d fix: edit image: image field is null 2025-03-06 16:34:55 +08:00
jialin 25d70b7b49 fix: preview field missing in image 2025-03-06 11:55:16 +08:00
jialin 4c5946e8da fix: can be cleared during loading in embedding and rerank 2025-03-06 09:49:07 +08:00
jialin 4de1a38c00 fix: do not init meta data when switch tab 2025-03-05 20:30:53 +08:00
jialin caadc02fb4 chore: reduce re-render times for params in playground 2025-03-05 15:09:47 +08:00
jialin 3e691aa31f fix: default model in embedding page 2025-03-05 14:05:12 +08:00
jialin fd7ce9027a feat: add expand all rows 2025-03-05 14:05:12 +08:00
EVGENY Mandjialin 3fdde5f8c4 Update playground.ts
Upd
2025-03-05 11:25:37 +08:00
jialin 4c5eb721fb chore: update TODO for locales 2025-03-04 19:18:13 +08:00
jialin f3bdb03cae chore: add TODO: Translate me in locales 2025-03-04 18:50:34 +08:00
jialin 9b6112d206 fix: common.ts locales miss comma in ru 2025-03-04 18:07:42 +08:00
EVGENY Mandjialin beab0fa6f6 Rename ru_RU.ts to ru-RU.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin fa60cab587 Create ru_RU.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin 05da6b3c50 Create users.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin 0b12f4e6fd Create usage.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin b9ddf29289 Create shortcuts.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin 10e47b8305 Create resources.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin 0e1c9487f0 Create playground.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin 60f569dbf9 Create models.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin bdb803db21 Create menu.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin 634fab4d9f Create dashboard.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin 34a14865eb Create common.ts 2025-03-04 18:01:29 +08:00
rjohny55andjialin abcd3a30ce Create apikeys.ts
add ru_RU
2025-03-04 18:01:29 +08:00
jialin 9f40bf6f5d chore: generate invertion mask in image editor 2025-03-04 17:52:14 +08:00
jialin 8a98aef28c chore: image edit invert painting area 2025-03-04 17:52:14 +08:00
jialin bb47b4475e chore: per-commit lint 2025-03-03 14:30:55 +08:00
jialin 1bb6c5fbfc chore: init chat params 2025-03-03 10:13:06 +08:00
jialin 35fe459420 chore: init wrapper scroller 2025-03-03 10:13:06 +08:00
jialin d75ac45c33 fix: expand rows in models after operating 2025-02-28 20:07:03 +08:00
jialin 9927da5088 fix: do not init audio model 2025-02-28 12:23:02 +08:00
jialin 295b4b3b72 chore: download progress 2025-02-27 18:03:28 +08:00
jialin 8464e0ea3f feat: add download instance log button 2025-02-27 18:03:28 +08:00
jialin 4b73457f7f style: gpuselector dropdown style 2025-02-26 16:00:29 +08:00
jialin eedcf6f1fe style: select component 2025-02-26 16:00:29 +08:00
jialin 5b130d9500 fix: update first login state after deploying from catalog 2025-02-25 17:49:33 +08:00
jialin 600f457bc2 chore: update /v1-openai to /v1 in playground test code 2025-02-25 16:10:40 +08:00
jialin e1959f74aa chore: first login to default page by localhost 2025-02-25 15:04:05 +08:00
jialin 0f7d04e0b9 fix: page error when edit error 2025-02-25 14:03:14 +08:00
jialin f91311144b fix(style): layout content padding 2025-02-24 14:10:50 +08:00
jialin 529b3cb18f chore: get start from deploying 2025-02-24 11:47:06 +08:00
jialin bcbefe29e7 chore: get start from deploying 2025-02-24 11:34:40 +08:00
jialin 1dd7037aa0 fix: params form render depds on fields 2025-02-23 13:32:03 +08:00
jialin 2c2e9396c4 fix: default route for logo 2025-02-23 13:32:03 +08:00
jialin 69feb6a4f1 chore: image edit init params 2025-02-23 13:32:03 +08:00
jialin 911b4b9138 chore: audio init parametes 2025-02-23 13:32:03 +08:00
jialin 21cd4b67f0 chore: rerank init params 2025-02-23 13:32:03 +08:00
jialin 8c7eebe76c chore: embedding init params 2025-02-23 13:32:03 +08:00
jialin bb8b00e547 refactor: create image hooks 2025-02-23 13:32:03 +08:00
jialin f8c7f88ac2 feat: add custom modal for lock body scroller 2025-02-23 13:32:03 +08:00
jialin c6cc5810ca feat: add env field in deploy form 2025-02-21 17:05:06 +08:00
jialin a89ff584fd chore: minimize static files 2025-02-21 12:21:21 +08:00
jialin 11d824a88d fix: vox-box gpu-selector 2025-02-21 11:45:50 +08:00
jialin f1ab927a7e chore: chat hooks 2025-02-19 20:50:32 +08:00
jialin 9e0634f449 refactor: models list table columns from props 2025-02-19 15:17:17 +08:00
jialin a9006f2954 fix: do not need to open the row after batch updating 2025-02-18 20:06:20 +08:00
jialin 3a021e7879 fix: batch start/stop selected counts 2025-02-18 19:51:22 +08:00
jialin 6ea8cc9986 chore: copy model-tag from user-view 2025-02-18 19:51:22 +08:00
jialin 4c77151877 chore: render katex in markdown 2025-02-18 19:51:22 +08:00
jialin ea34431cf7 chore: react-markdown 2025-02-17 13:49:55 +08:00
jialin 7c546ed6b8 chore: update ui tips 2025-02-17 13:49:55 +08:00
jialin db53920153 style: menu style 2025-02-17 13:49:55 +08:00
jialin c60015bd09 chore: stt player ui 2025-02-17 13:49:55 +08:00
jialin d2a3388058 chore: improve image edit 2025-02-17 13:49:55 +08:00
jialin 384a75622f style: lock body scroll bar when open a modal 2025-02-17 13:49:55 +08:00
jialin 68a62d689c chore: batch start/stop models 2025-02-17 13:49:55 +08:00
jialin 8f7968302d style: model source dropdown 2025-02-17 13:49:55 +08:00
jialin 35a5733e82 chore: gpu selector, source dropdown 2025-02-17 13:49:55 +08:00
jialin f6bbbc56ba chore: negative mask on edit image 2025-02-17 13:49:55 +08:00
jialin d1d601f028 chore: tag style 2025-02-17 13:49:55 +08:00
jialin bbb133d0f2 refactor: gpu selector 2025-02-17 13:49:55 +08:00
jialin 9671f57b65 fix: import lodash in component 2025-02-12 19:34:09 +08:00
jialin d3212c8b49 refactor: message content 2025-02-12 19:34:09 +08:00
jialin 1f01a5b1cc chore: reasoning content without <think> tag 2025-02-11 17:41:55 +08:00
jialin 95f7f5535f fix: do not rerender after editing the markdown 2025-02-11 15:31:16 +08:00
jialin 8ae031dbbd style: markdown render 2025-02-11 14:01:46 +08:00
jialin 4498f069f0 feat: render markdown in chat 2025-02-11 14:01:46 +08:00
jialin 349b895ac5 feat: dcu container worker guide 2025-02-11 10:35:25 +08:00
jialin 794f27a3c8 chore: chat reasoning content 2025-02-10 21:53:36 +08:00
jialin 1def9a6b19 chore: field description icon 2025-02-10 18:44:21 +08:00
jialin cbf1e42c73 chore: local path field tooltip 2025-02-10 11:59:57 +08:00
jialin 7c960bb899 fix: set distributed_inference_across_workers to false when selectingt vox-box 2025-02-09 21:53:46 +08:00
jialin 1a1807df96 fix: download image size on edit page 2025-02-06 15:04:15 +08:00
jialin 2d03f17bde chore: refine wording 2025-02-06 11:07:38 +08:00
jialin 8cbaa6b281 fix: download image size is incorrect 2025-02-05 16:27:01 +08:00
jialin 2c0ae66143 style: side menu raw scroll bar width 0 2025-01-22 18:28:44 +08:00
jialin a54c160d83 fix: remove the constant deps for watch logs 2025-01-22 17:38:24 +08:00
jialin 61fb7b0d86 fix(style): tooltip scroll bar color, auto input trim spaces 2025-01-22 16:32:46 +08:00
jialin b3beae44df fix: child row expand status sync 2025-01-22 15:33:12 +08:00
jialin d1369e765a style: table no data 2025-01-21 14:25:14 +08:00
jialin 6185485c68 fix: update instances with full data 2025-01-21 10:31:40 +08:00
jialin db733ac9ce fix: json stream data is truncated 2025-01-20 22:08:08 +08:00
jialin f94fcf58a7 fix: update instances by filter 2025-01-20 17:47:36 +08:00
jialin 7487841385 chore: save iconfont files locally 2025-01-20 17:47:36 +08:00
jialin 289c4b497d chore: save iconfont files locally 2025-01-20 10:37:54 +08:00
jialin c49bfb97dd fix: clear instances when page hidden 2025-01-19 20:51:06 +08:00
jialin 4643dbce17 fix(style): brush can not fully paint the image 2025-01-19 00:00:15 +08:00
jialin 82e8c01b95 chore: set image raw size to form 2025-01-18 16:03:48 +08:00
jialin 47ced11e03 fix: reset update instance list flag 2025-01-17 23:39:10 +08:00
jialin 04d35a3a83 chore: all models page count 2025-01-17 23:22:49 +08:00
jialin 1df3a0b8cb fix: model instances update when tab active 2025-01-17 23:16:38 +08:00
jialin faa13f58e0 fix: catalog form meta data update 2025-01-17 21:22:15 +08:00
jialin 58fcc90417 fix: clear models expand keys 2025-01-17 14:35:36 +08:00
jialin 0690612477 fix: dashboard usage display 2025-01-16 22:27:04 +08:00
jialin c0344b385a fix: failed to load image when pass empty mask 2025-01-16 22:20:32 +08:00
jialin 214c5998c6 fix: image stream data error 2025-01-16 21:51:22 +08:00
jialin b14c01f9f7 fix: expand the model after deploying from catalog 2025-01-16 17:24:37 +08:00
jialin 4a838e7bdb chore: completions error handler 2025-01-16 14:25:03 +08:00
jialin 4a748e894d chore: rename copy button less 2025-01-16 10:33:18 +08:00
jialin b576491156 fix: remove storkes when use a new base image 2025-01-16 10:14:05 +08:00
jialin 17da790651 fix: update origin image uid for second edit 2025-01-15 22:58:27 +08:00
jialin c599cab14a fix: image display new image 2025-01-15 21:37:28 +08:00
jialin 4240bad627 fix: reranker selection 2025-01-15 19:36:44 +08:00
jialin 0017de7b21 fix: fixed point line width 2025-01-15 17:07:44 +08:00
jialin 53a4ebb66e fix: paste text can not overwrite the selection 2025-01-15 16:11:57 +08:00
jialin 5bfca0f86f chore: message link 2025-01-15 12:42:09 +08:00
jialin 9553aa944a fix: image progress display 2025-01-15 09:51:29 +08:00
jialin 35991ff5d6 chore: llama-box parameters 2025-01-14 18:58:07 +08:00
jialin 42d703ca1d chore: image edit scale 2025-01-14 17:11:46 +08:00
jialin e089ddb223 chore: image edit scale 2025-01-14 17:11:46 +08:00
jialin c323b6a8a9 chore: instance unreachable state 2025-01-14 09:40:15 +08:00
jialin bf461f59de fix: do not edit a image in loading 2025-01-13 19:25:30 +08:00
jialin 9974fa831c fix: image size options 2025-01-13 16:34:08 +08:00
jialin 73e41b0de0 fix: update page number of new logs 2025-01-13 15:59:32 +08:00
jialin 9aa297a804 chore: model file description 2025-01-13 15:51:34 +08:00
jialin 5c1bcdbd74 fix: clear screen logs after loading all 2025-01-13 11:15:34 +08:00
jialin 8c4997fa37 chore: image meta data 2025-01-13 08:22:23 +08:00
jialin d099a22bd9 fix: set last page after loading all logs 2025-01-12 20:01:27 +08:00
jialin 0de0426f72 fix: logs page by the data after parsing 2025-01-12 17:04:12 +08:00
jialin 04d5b692b8 fix: miss logs 2025-01-10 20:23:15 +08:00
jialin da6cdcef84 fix(style): gpu selector closable 2025-01-10 16:55:24 +08:00
jialin fbf2671eaf fix(style): gpu selector closable 2025-01-10 16:51:55 +08:00
jialin 67e050bd6f chore: unreachable state is not ready 2025-01-10 15:53:14 +08:00
jialin 8282f48cdb fix: calc log lines 2025-01-10 15:41:01 +08:00
jialin 5d903de2a2 chore: worker unreachable state 2025-01-10 12:25:06 +08:00
jialin 78deee2de3 chore: llm ctx max value 2025-01-10 10:49:06 +08:00
jialin a09403328e fix: do not update when scrolling to view logs 2025-01-10 10:42:41 +08:00
jialin 45e92e7b7a fix: image preview 2025-01-09 20:23:36 +08:00
jialin ebe8a40202 chore: update lock.yaml 2025-01-09 18:00:07 +08:00
jialin bd0747ff6f revert: image editor ux 2025-01-09 17:53:26 +08:00
jialin b37ec98e17 fix: set max_tokens to meta's half 2025-01-09 16:34:49 +08:00
jialin a93db0a038 fix(style): instance status message 2025-01-09 14:56:48 +08:00
jialin 08f9029bf8 chore: audio file .m4a support 2025-01-09 14:11:26 +08:00
jialin fb9d2d99d4 fix: display current page's logs 2025-01-09 11:27:44 +08:00
jialin a374d4d40f fix: body scrolls to top after opening a modal 2025-01-09 11:27:44 +08:00
jialin fb4666195c fix(style): catalog size tags overflow 2025-01-09 09:26:42 +08:00
jialin 39b6c00c6d fix: stop auto scrolling on logs 2025-01-08 15:43:03 +08:00
jialin decb3ef2f1 fix: add a button to last page on logs 2025-01-08 15:26:03 +08:00
jialin 2a9c501ee2 fix: form data merge with raw data 2025-01-08 13:45:05 +08:00
jialin 60d25a18fb chore: remove source in the form 2025-01-08 12:34:53 +08:00
jialin 39a71d51cf fix: image edit ux 2025-01-06 20:45:32 +08:00
jialin 5c401f3858 chore: catalog page size 100 2025-01-06 08:29:56 +08:00
jialin cc45ec85fd chore: models filter by category 2025-01-03 20:51:22 +08:00
jialin 1d66becff5 fix: default category 2025-01-03 20:51:22 +08:00
jialin 2a4ebcaf9c chore: search by debounce 2025-01-03 20:51:22 +08:00
jialin 1a792254ca chore: catalog card style 2025-01-03 20:51:22 +08:00
jialin d9319f5734 chore: catalog api 2025-01-03 20:51:22 +08:00
jialin 81d96fe3a9 style: catalog item style 2025-01-03 20:51:22 +08:00
jialin 39fff0e57d feat: catalog page 2025-01-03 20:51:22 +08:00
jialin 95058f7890 fix: do not update logs when viewing pre page 2025-01-03 20:38:44 +08:00
jialin 472ef1a231 chore: audio meta data 2025-01-03 17:27:19 +08:00
jialin d7de302393 fix: automatically update the page when scrolling 2025-01-02 12:22:09 +08:00
jialin e4b1dfc77a chore: audio page keepalive 2024-12-31 11:04:30 +08:00
jialin aed7267253 chore: model meta data 2024-12-30 16:07:30 +08:00
jialin a24b7433a5 chore: update edit api 2024-12-30 08:37:58 +08:00
jialin 0b423a6fe0 chore: image edit api 2024-12-30 08:37:58 +08:00
jialin cb98812444 chore: select multiple gpus by manual 2024-12-29 18:31:42 +08:00
jialin b4e30565d2 feat: model category 2024-12-27 19:12:51 +08:00
jialin 9f40e2c71e chore: watch request counts 2024-12-27 14:56:06 +08:00
jialin fb0a2798e7 chore: update img args 2024-12-27 14:56:06 +08:00
jialin 9912b5037d chore: disable editor when loading 2024-12-27 14:56:06 +08:00
jialin bca56bfaad chore: painting cache 2024-12-27 14:56:06 +08:00
jialin 542f048a67 chore: image edit ux 2024-12-27 14:56:06 +08:00
jialin 91c5e7e06c feat: image edit 2024-12-27 14:56:06 +08:00
jialin 972ee69fac style: view instance logs 2024-12-26 12:15:12 +08:00
jialin 00c9ef47e9 chore: search models tips 2024-12-25 16:48:20 +08:00
jialin dcad5f4b5f chore: success toast show twice after deleting 2024-12-25 11:36:02 +08:00
jialin e74cda3c0f chore: image args update 2024-12-24 16:43:19 +08:00
jialin bafbb39883 fix: backend input focus not work 2024-12-24 14:31:38 +08:00
jialin 02391e66dc chore: adjust the deletion modal config 2024-12-24 10:34:08 +08:00
jialin 762ab30c71 chore: add worker command paramters 2024-12-23 19:13:55 +08:00
jialin 6ce6a932e1 chore: add worker labels 2024-12-23 16:44:57 +08:00
jialin e7de1896ea chore: display the direct command in add worker 2024-12-23 16:33:08 +08:00
jialin 4391705c9a chore: model item action list order 2024-12-20 18:27:29 +08:00
jialin b40bf76270 chore: the text on the recreate button 2024-12-19 19:42:57 +08:00
jialin f44aee0af4 feat: model list add stop and start button 2024-12-18 16:13:58 +08:00
jialin 57a1af9392 fix: convert recording to mp3 2024-12-16 18:35:03 +08:00
jialin b16ae64105 fix: modelscope model tasks field null 2024-12-13 18:42:36 +08:00
jialin 0912d583c7 style: open in playground icon 2024-12-13 13:41:02 +08:00
jialin 6eff89aca1 style: audio tab icon 2024-12-13 13:17:07 +08:00
jialin 6e5e195a30 style: model list type tag 2024-12-13 12:13:17 +08:00
jialin e3efda2764 fix: deploy model page error 2024-12-13 10:15:46 +08:00
jialin 5360c3dbaf chore: mp3 converter exec load after init 2024-12-12 19:33:02 +08:00
jialin f6427c50f2 chore: update audio catalog for modelscope 2024-12-12 17:37:14 +08:00
jialin 22035d1383 chore: fetch model list after deleting action 2024-12-12 17:04:07 +08:00
jialin 85949c5927 fix: delay in updating model list 2024-12-12 16:28:14 +08:00
jialin dde746a5fe fix: do not collapse other models, after creating a new 2024-12-12 14:12:33 +08:00
jialin c2ae30575e fix: disable vox-box item when deploy ollama model 2024-12-12 11:49:46 +08:00
jialin cb5d9f626e fix: query is not updated on deploy page when tap enter 2024-12-12 10:03:16 +08:00
jialin c6d82409a8 chore: remove upload on image page 2024-12-11 18:44:00 +08:00
jialin fef5d0e688 fix: audio, recording format error 2024-12-11 18:39:36 +08:00
jialin f64e696f7a chore: support editing the model repoID, filename, model path 2024-12-10 15:43:29 +08:00
jialin acf99a6a9e refactor: generate code viewer 2024-12-09 15:28:18 +08:00
gitlawr a76560c38a chore: add LICENSE 2024-12-09 11:37:37 +08:00
jialin e1eec66e04 fix: text to speech python code 2024-12-05 20:54:28 +08:00
jialin 96d1ee2347 revert: speech to text code use openai lib 2024-12-05 19:50:29 +08:00
jialin 2a06463d07 fix: audio speech to text nodjs code 2024-12-05 18:20:13 +08:00
jialin 899862dc57 fix: audio view code 2024-12-05 17:54:20 +08:00
jialin c8d585889b fix: image random seed uncheck not work 2024-12-05 13:44:16 +08:00
jialin d044423330 fix: image handleonload callback 2024-12-04 21:03:42 +08:00
jialin 273a9a5e66 fix: convert recording to mp3 2024-12-04 20:37:09 +08:00
jialin 0294e0d2b3 fix: recording format for browser 2024-12-04 20:13:08 +08:00
jialin 38daa0826e fix: audio api error message 2024-12-04 19:02:10 +08:00
jialin b9e8dea5d9 chore: update audio docs link 2024-12-04 17:01:43 +08:00
jialin 241930cefe chore: rerank documents verify non-empty 2024-12-04 15:15:35 +08:00
jialin bed3684a0c fix: reset backend parameter options in deploy model modal 2024-12-04 11:15:29 +08:00
jialin e1bb684c4c chore: image size tooltips 2024-12-03 21:54:59 +08:00
jialin 4c75a5b421 fix: audio player pause 2024-12-03 20:21:20 +08:00
jialin 20f809740c fix: audio error message 2024-12-03 17:33:49 +08:00
jialin 83294abaf0 fix: audio set progress error 2024-12-03 16:17:54 +08:00
jialin 687dabc777 fix: audio set progress error 2024-12-03 16:17:54 +08:00
jialin 605d6f0f9b chore: update llama-box parameters 2024-12-03 16:17:54 +08:00
jialin b1d13f5a71 fix(style): image size cache' 2024-12-02 22:15:43 +08:00
jialin 50c740d219 fix(style): image wraper full size 2024-12-02 18:56:27 +08:00
jialin a7456d1182 fix: add cancel for generate text 2024-12-02 17:50:21 +08:00
jialin 804cbb8c56 style: image display ratio 2024-12-02 17:00:26 +08:00
jialin cb13f66b3d chore: voice language default value by current language 2024-12-02 10:44:39 +08:00
jialin ec2cd29096 chore: slider to change width and height in image 2024-12-02 08:20:30 +08:00
jialin 412c6dadca fix(style): stt loading 2024-11-29 22:10:52 +08:00
jialin 1ac3768468 fix: speech size 0, do not create url 2024-11-29 21:09:03 +08:00
jialin e622636686 style: show voice error message 2024-11-29 20:02:54 +08:00
jialin 2ddeca8f9d chore: add copy button 2024-11-29 17:03:46 +08:00
jialin d1a80e1a64 fix: tts show error message 2024-11-29 17:03:46 +08:00
jialin 4cfe41ca9e fix: image view code modal logs 2024-11-29 17:03:46 +08:00
jialin cd1d3005e9 fix: playground view code 2024-11-29 15:26:39 +08:00
jialin 435161854c fix: model logs loading 2024-11-29 13:41:28 +08:00
jialin 890287ce72 fix: image request error message 2024-11-29 10:58:16 +08:00
jialin 0cc2a40f26 chore: docker add worker command 2024-11-28 23:19:31 +08:00
jialin 849150c9ab fix: auto bgcolor remove 2024-11-28 22:03:33 +08:00
jialin 75ac74ca5e fix: image autosize 2024-11-28 22:03:33 +08:00
jialin 9822479d24 fix: remove image auto background 2024-11-28 21:58:28 +08:00
jialin c456f63e8c fix: jump to playground from model list 2024-11-28 21:58:28 +08:00
jialin 51ae3a16bd fix: jump to playground from model list 2024-11-28 21:48:14 +08:00
jialin bd418b23dc fix(style): playground image incomplete 2024-11-28 17:13:51 +08:00
jialin af789ee886 fix: rerank clear failed 2024-11-27 22:47:53 +08:00
jialin 324bd57e3d fix: image chunk data broken 2024-11-27 21:13:31 +08:00
jialin 146bcdcf1c fix: recording do not pass file type 2024-11-27 19:42:29 +08:00
jialin 60c92b8a98 chore: audio api adjust 2024-11-27 19:35:19 +08:00
jialin 230120fff5 chore: image custom params 2024-11-27 17:07:22 +08:00
jialin ba76498acc chore: audio model deploy 2024-11-27 11:04:31 +08:00
jialin 5e0772fae9 chore: images style 2024-11-25 20:07:17 +08:00
jialin 7fcd005f06 chore: audio 2024-11-25 20:07:17 +08:00
jialin 961d420c95 chore: encode url for hf 2024-11-25 12:58:27 +08:00
jialin a42df69a7f feat: add backend version field 2024-11-25 12:10:12 +08:00
jialin 59d2c5ae3c fix: safari page blank 2024-11-22 20:16:23 +08:00
jialin a6f0f554f0 fix: model be cleared when apply config to all in compare 2024-11-22 18:25:07 +08:00
jialin c8c22b3f22 fix: model markdown parse failed 2024-11-22 11:55:19 +08:00
jialin 67febd3e25 style: create images ux 2024-11-22 10:00:34 +08:00
jialin dde937f460 chore: images create 2024-11-22 10:00:34 +08:00
jialin c3473673da chore: speech to text 2024-11-22 10:00:34 +08:00
jialin f24aef300b feat: generate images 2024-11-22 10:00:34 +08:00
jialin 84e0c46711 feat: playground tts 2024-11-22 10:00:34 +08:00
jialin 16e2ac5b6c feat: playground embedding 2024-11-22 10:00:34 +08:00
jialin 01214077d3 fix: rebase main 2024-11-22 10:00:34 +08:00
jialin 1e3957bdd5 refactor: playground rerank layout 2024-11-22 10:00:34 +08:00
jialin 8e7fa486db style: submenu title color 2024-11-22 10:00:34 +08:00
jialin a72088b7a8 chore: rebase main 2024-11-22 10:00:34 +08:00
jialin 419f1e07d1 refactor: rerank item 2024-11-22 10:00:34 +08:00
jialin e05ec3d2d5 feat: playground add submenu 2024-11-22 10:00:34 +08:00
jialin 22f90a505c chore: hf api use proxy 2024-11-20 17:51:28 +08:00
jialin 66e506db07 fix: deploy model shardfile file name 2024-11-18 18:56:47 +08:00
jialin fa4041e560 style: status tooltip 2024-11-18 17:24:07 +08:00
jialin f8a8225b8c fix: close deploy modal reset form 2024-11-13 19:23:31 +08:00
jialin 75636b2575 fix: form fields do not update when toggle backend 2024-11-13 11:45:03 +08:00
jialin e44cc4c145 fix: update form options when open modal 2024-11-12 20:53:07 +08:00
jialin 343ada135d fix: backend updateable when local path 2024-11-08 15:09:25 +08:00
jialin 93a6a77c2b chore: deploy model from local path 2024-11-07 17:35:07 +08:00
jialin 8bc67b323c style: replace virtual inner with logs list 2024-11-06 09:29:12 +08:00
jialin f684a3b0ae fix: large logs page stuck 2024-11-05 19:46:47 +08:00
jialin 5f2115fff6 fix: page got stuck when logs size too large 2024-11-05 19:46:47 +08:00
jialin 9d654bcd66 fix: show upgrade check 2024-10-31 11:06:58 +08:00
jialin 5f8e72c6ae chore: update vllm arguments 2024-10-31 11:06:58 +08:00
jialin 5dde5cae50 fix: filter gguf files in modelscope 2024-10-29 17:55:40 +08:00
jialin f730548c8f fix(style): tooltip shown when no content 2024-10-25 22:36:26 +08:00
jialin a185bd9463 style: viewcode scrollbar color 2024-10-25 20:52:15 +08:00
jialin abdc78e123 fix(style): text overflow 2024-10-25 18:36:18 +08:00
jialin ba49fa6c88 chore: completion payload format 2024-10-25 12:15:26 +08:00
jialin 870ffa9dc1 chore: add button for copy logs 2024-10-24 23:23:47 +08:00
jialin 8afaf1a60e chore: update playground payload format 2024-10-24 22:40:38 +08:00
jialin 6974ac8e14 chore: parse bibtex 2024-10-24 22:40:38 +08:00
jialin 9f274ee17e chore: remove metadata of readme 2024-10-24 17:25:31 +08:00
jialin 673bcde719 fix: playground error message field 2024-10-24 14:52:57 +08:00
jialin 6eaf5bb463 style: comparsion model card title 2024-10-24 11:54:21 +08:00
jialin b463eedb3f fix: remove invalid parameter 2024-10-24 10:25:18 +08:00
jialin 90350f99ad style: table column size 2024-10-23 19:36:29 +08:00
jialin 8576015633 fix: chart resize 2024-10-23 18:04:34 +08:00
jialin f5edf39027 chore: worker ip 2024-10-23 14:47:55 +08:00
jialin 751781e3e5 fix: distributed across workers 2024-10-23 14:27:49 +08:00
jialin bc9129bcbe fix(style): body scroll 2024-10-22 18:37:45 +08:00
jialin c442a33d5e fix: stream_options spelling 2024-10-22 15:46:35 +08:00
jialin 902bb06353 fix: logs viewer do not scroll after opened 2024-10-22 15:36:53 +08:00
jialin a0a1b8b3e8 chore: openai api error message 2024-10-22 10:17:29 +08:00
jialin eb5cf9da8d fix: logs scrollbar ux 2024-10-22 09:29:03 +08:00
jialin 57386eeb55 style: body and side menu scrollbar style 2024-10-21 11:36:54 +08:00
jialin 33a21f2aaa fix: scrollbar ux 2024-10-20 12:47:14 +08:00
jialin d6fd498489 chore: logs style 2024-10-20 10:40:17 +08:00
jialin 386f2969eb chore: upgrade check 2024-10-18 19:35:47 +08:00
jialin 2fea3a4b40 chore: parse ansi 2024-10-18 15:20:55 +08:00
jialin b9c9fe7a97 fix: model instances limit 2024-10-18 12:09:09 +08:00
jialin 594c4cd670 fix: select same model will clear filename 2024-10-18 10:59:01 +08:00
jialin e10c5e28b5 fix: upload a image can clear other message 2024-10-17 16:06:38 +08:00
jialin fbefb2014d fix: do not clear system message, on clear button 2024-10-17 15:49:41 +08:00
jialin 909da7edb5 style: model tag style 2024-10-17 14:59:42 +08:00
jialin 349676d908 fix: adjust image size when paste 2024-10-17 13:32:38 +08:00
jialin a47f7cc0ce fix: no request, search model 2024-10-15 17:52:02 +08:00
jialin 8fbdb884c7 chore: hide rerank tab 2024-10-14 10:46:32 +08:00
jialin ec68ce082e fix(style): document list 2024-10-14 10:40:13 +08:00
jialin 2b61e3dfd3 fix(style): input text hover 2024-10-14 10:33:00 +08:00
jialin 4c3dddc486 feat: playground rerank 2024-10-14 10:27:46 +08:00
jialin ecc683a6bd fix: cpu_offload is not shown when editting model 2024-10-09 19:23:29 +08:00
jialin 7b2098cf33 fix: playground params do not update after being changed 2024-10-09 15:07:12 +08:00
jialin 3784d86344 chore: update antd 2024-10-09 14:08:27 +08:00
jialin 2b22481443 style: change select to radio group 2024-10-09 14:08:27 +08:00
jialin c041d768b2 style: model readme.md table cell align left 2024-09-30 20:12:01 +08:00
jialin 5df6154abe fix: system message can not sync to others 2024-09-30 19:51:01 +08:00
jialin 1fed02d23f fix: modal title does not upate after change language 2024-09-30 19:10:13 +08:00
jialin 2d34d07da4 fix: language does not refresh after toggling 2024-09-30 18:54:48 +08:00
jialin ea25291d75 fix(style): model readme img render 2024-09-30 16:33:38 +08:00
jialin 5f77a0082c fix: models compare system message sync to all 2024-09-30 11:45:42 +08:00
jialin 3978ec683d style: no available models tips 2024-09-29 20:34:11 +08:00
jialin 458f467985 chore: modelscope downloading state 2024-09-29 18:58:12 +08:00
jialin 69ffdd4604 fix(style): markdown viewer text-intent 2024-09-29 16:54:00 +08:00
jialin 5c2503b2a8 chore: add no available models notes 2024-09-29 11:52:50 +08:00
jialin bc921ff835 fix(style): hide table cell content if too long 2024-09-28 19:23:56 +08:00
jialin 197488bff6 fix: chat error message 2024-09-27 19:19:56 +08:00
jialin e48d21c8cb fix: overlayscrollbars.css 2024-09-27 17:13:53 +08:00
jialin 7e992fad99 fix: update lock.yaml 2024-09-27 17:00:22 +08:00
jialin 49c0467428 fix: query modelscope files by recursive 2024-09-27 16:50:09 +08:00
jialin 7e985991cd fix(style): compare sroll 2024-09-26 19:52:54 +08:00
jialin cc7d2ded6c fix: update model backend not show 2024-09-26 14:04:19 +08:00
jialin f813f56c1f chore: vllm params 2024-09-26 10:30:40 +08:00
jialin a698c65a07 fix: playground edit message 2024-09-25 16:17:25 +08:00
jialin 3cd96ba2e8 feat: vllm support 2024-09-25 16:17:25 +08:00
jialin 0652f850d6 fix: modelscope model name 2024-09-25 16:17:25 +08:00
jialin 3ab29f9e01 feat: modelscope model 2024-09-22 14:55:23 +08:00
jialin b041cdc766 style: playground style 2024-09-22 14:55:23 +08:00
jialin c04b9342b8 refactor: playground add comparsion 2024-09-22 14:55:23 +08:00
jialin 1abaa164f5 refactor: playground chat 2024-09-22 14:55:23 +08:00
jialin 4f4f00f0c8 feat: add models compare 2024-09-22 14:55:23 +08:00
jialin 2e5f0d9210 fix: submit message 2024-09-22 14:55:23 +08:00
jialin af077c4706 style: upload image in message input 2024-09-22 14:55:23 +08:00
Arne Sundandjialin a5cebb88ef Fix typos in Resources table headings 2024-09-22 12:10:25 +08:00
gitlawr 6baf8f08c8 docs: add title 2024-09-17 09:34:41 +08:00
1140 changed files with 131920 additions and 29397 deletions
+2
View File
@@ -1,2 +1,4 @@
PORT=9000 PORT=9000
UMI_DEV_SERVER_COMPRESS=none UMI_DEV_SERVER_COMPRESS=none
DID_YOU_KNOW=none
-9
View File
@@ -1,9 +0,0 @@
module.exports = {
extends: require.resolve('@umijs/max/eslint'),
rules: {
'react/no-unstable-nested-components': 1,
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/class-name-casing': 'off'
}
};
+20 -10
View File
@@ -4,14 +4,16 @@ on:
push: push:
branches: branches:
- 'main' - 'main'
- 'v*-dev'
tags: tags:
- '*.*.*' - '*.*.*'
pull_request: pull_request:
branches: branches:
- 'main' - 'main'
- 'v*-dev'
env: env:
NODE_VERSION: '21' NODE_VERSION: '22'
jobs: jobs:
deps: deps:
@@ -30,7 +32,7 @@ jobs:
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: '${{ env.NODE_VERSION }}' node-version-file: '.nvmrc'
cache: 'pnpm' cache: 'pnpm'
- name: Deps - name: Deps
run: scripts/deps run: scripts/deps
@@ -72,11 +74,6 @@ jobs:
if: github.event_name == 'push' if: github.event_name == 'push'
timeout-minutes: 30 timeout-minutes: 30
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
strategy:
matrix:
version: ['latest', '${{ github.ref_name }}']
exclude:
- version: 'main'
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -92,10 +89,23 @@ jobs:
${{ github.workspace }}/node_modules ${{ github.workspace }}/node_modules
- name: Build - name: Build
run: scripts/build run: scripts/build
- name: Determine Version
id: version
run: |
if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then
echo "version=latest" >> $GITHUB_OUTPUT
elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then
echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
elif [[ "${GITHUB_REF}" == refs/heads/v*-dev ]]; then
echo "version=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
else
echo "Not a publish target"
exit 1
fi
- name: Package - name: Package
run: scripts/package run: scripts/package
env: env:
VERSION: '${{ matrix.version }}' VERSION: '${{ steps.version.outputs.version }}'
- name: Release - name: Release
uses: TencentCloud/cos-action@b0aa648235fb35a1bdd6a77f529eb0ac4c2f1c25 uses: TencentCloud/cos-action@b0aa648235fb35a1bdd6a77f529eb0ac4c2f1c25
with: with:
@@ -103,7 +113,7 @@ jobs:
secret_key: ${{ secrets.CI_TECENTCOS_SECRET_KEY }} secret_key: ${{ secrets.CI_TECENTCOS_SECRET_KEY }}
cos_bucket: ${{ secrets.COS_BUCKET }} cos_bucket: ${{ secrets.COS_BUCKET }}
cos_region: ${{ secrets.COS_REGION }} cos_region: ${{ secrets.COS_REGION }}
local_path: dist/${{ matrix.version }}.tar.gz local_path: dist/${{ steps.version.outputs.version }}.tar.gz
remote_path: releases/${{ matrix.version }}.tar.gz remote_path: releases/${{ steps.version.outputs.version }}.tar.gz
accelerate: true accelerate: true
clean: false clean: false
+4
View File
@@ -12,3 +12,7 @@
/.mfsu /.mfsu
.swc .swc
.DS_Store .DS_Store
.idea
.claude
/dist.zip
.cache
+2 -1
View File
@@ -1 +1,2 @@
npx --no-install lint-staged --quiet
npx lint-staged
+6 -12
View File
@@ -1,17 +1,11 @@
{ {
"*.{md,json}": [ "*.{md,json}": ["prettier --cache --write"],
"prettier --cache --write" "*.{js,jsx}": ["max lint --fix --eslint-only", "prettier --cache --write"],
], "*.{css,less}": ["prettier --cache --write"],
"*.{js,jsx}": [ "!public/vs/**": [],
"max lint --fix --eslint-only",
"prettier --cache --write"
],
"*.{css,less}": [
"max lint --fix --stylelint-only",
"prettier --cache --write"
],
"*.ts?(x)": [ "*.ts?(x)": [
"max lint --fix --eslint-only", "max lint --fix --eslint-only",
"prettier --cache --parser=typescript --write" "prettier --cache --parser=typescript --write"
] ],
"src/locales/**/*.ts": ["node --import tsx src/locales/check.ts"]
} }
+1
View File
@@ -0,0 +1 @@
22
+5
View File
@@ -1,3 +1,8 @@
node_modules node_modules
.umi .umi
.umi-production .umi-production
public/static/*.js
public/static/*.css
src/components/iconfont/
+2 -1
View File
@@ -2,5 +2,6 @@ module.exports = {
extends: require.resolve('@umijs/max/stylelint'), extends: require.resolve('@umijs/max/stylelint'),
rules: { rules: {
'selector-class-pattern': null 'selector-class-pattern': null
} },
ignoreFiles: ['public/static/*.css', 'src/components/iconfont/iconfont.css']
}; };
+265
View File
@@ -0,0 +1,265 @@
# React State and Request Patterns
These guidelines define preferred patterns for request handling, state updates, and side-effect management in React applications.
The primary goal is to keep data flow explicit, predictable, maintainable, and performant while avoiding unnecessary rerenders and effect-driven logic.
---
## 1. Avoid Effect-Driven Requests
Do not use request functions themselves as dependencies in `useEffect`.
Avoid patterns like:
```ts
useEffect(() => {
fetchData();
}, [fetchData]);
```
Requests should be triggered explicitly by user actions or lifecycle entry points.
---
## 2. Form Requests Should Be Action-Driven
For form-related requests (such as loading `Select` options):
- Fetch data when the form is opened for the first time.
- If later requests depend on user interactions, trigger them directly inside the interaction handler.
- Do not rely on `useEffect` dependency changes to trigger requests.
Recommended:
```ts
const handleOnChange = (value) => {
fetchData(value);
};
```
Avoid:
```ts
useEffect(() => {
fetchData(value);
}, [value]);
```
The action itself should control the request.
---
## 3. Update Related States Together
If a single action updates multiple related states:
- Do not synchronize them through `useEffect`
- Do not derive them indirectly through `useMemo`
Instead, update all related states directly inside the action handler.
Recommended:
```ts
const handleOnChange = (value) => {
setState1(...);
setState2(...);
buildState(...);
};
```
Avoid implicit state synchronization chains.
---
## 4. Group Strongly Related State
If multiple states are always updated together:
- Do not split them into multiple `useState` calls.
- Prefer a single state object.
Recommended:
```ts
const [state, setState] = useState({
state1: ...,
state2: ...,
state3: ...,
});
```
This reduces unnecessary rerenders and keeps state transitions predictable.
---
## 5. Prefer Explicit State Flow
Avoid chaining business logic through multiple `useEffect` hooks.
Keep:
- request execution
- state updates
- derived calculations
close to the triggering action whenever possible.
Prefer:
```ts
const handleAction = () => {
fetchData();
setTableData(...);
setSelectedRow(...);
};
```
Over:
```ts
useEffect(() => {
buildTable();
}, [data]);
useEffect(() => {
updateSelection();
}, [tableData]);
```
---
## 6. Avoid Premature Memoization
Do not use `useMemo` or `useCallback` unless there is a confirmed rendering or computation bottleneck.
Overusing memoization:
- increases complexity
- makes state flow harder to understand
- may introduce stale dependency issues
Prefer simple and explicit logic first.
Optimize only when necessary.
---
## 7. Keep Request Logic Predictable
A user interaction should clearly show:
- what request is triggered
- which states are updated
- how the UI changes
Avoid indirect update chains caused by dependency-driven effects.
The code should make the request and update flow easy to trace.
---
## 8. Prefer Action-Driven Architecture
Prefer:
- action-driven updates
- explicit handlers
- localized state transitions
Over:
- effect-driven synchronization
- cross-hook implicit updates
- reactive chains between states
The triggering action should remain the primary source of truth for UI updates.
---
# Form
Form-specific patterns that build on the rules above. The theme: keep cascading selections (pick A → derive B → write form) on a single, predictable path.
## 1. No Fallback for Derived Selection
When "pick A then auto-pick B", match by rule and return `undefined` if no match — let the corresponding form field stay empty.
Do not silently fall back to `list[0]` or another default. A fallback hides data issues and tricks the user into thinking they have a valid selection.
```ts
const findB = (key, list) =>
key ? list.find((x) => x.key === key) : undefined;
```
For form fields, prefer clearing with `undefined` over `''`. With Ant Design, `undefined` restores the placeholder; `''` is treated as a real value.
## 2. Async Race Protection
For fetches triggered by a lifecycle entry (e.g., modal open), tag each invocation with a session ref. Discard stale results if the session has rotated (the modal was closed and re-opened) by the time the response arrives.
```ts
const sessionRef = useRef(0);
useEffect(() => {
if (!open) {
sessionRef.current += 1;
return;
}
const session = ++sessionRef.current;
Promise.all([fetchA(), fetchB()]).then(([as, bs]) => {
if (sessionRef.current !== session) return;
applySelection(as.items[0], findB(as.items[0].key, bs.items));
});
}, [open]);
```
## 3. Reference Template
A typical form with two cascading selectors backed by a single shared state:
```ts
type Selection = { a?: string; b?: number };
const [selection, setSelection] = useState<Selection>({});
const sessionRef = useRef(0);
const findB = (key, list) =>
key ? list.find((x) => x.key === key) : undefined;
// Single atomic write: state + form together.
const applySelection = (a, b) => {
setSelection({ a: a.name, b: b?.id });
form.current?.setFieldsValue({
field: b?.field,
spec: { ...currentSpec, ...b?.spec }
});
};
// Trigger 1: modal opened
useEffect(() => {
if (!open) {
sessionRef.current++;
setSelection({});
return;
}
const session = ++sessionRef.current;
Promise.all([fetchA(), fetchB()]).then(([as, bs]) => {
if (sessionRef.current !== session) return;
const first = as.items[0];
applySelection(first, findB(first.key, bs.items));
});
}, [open]);
// Trigger 2: user picks A
const handleAChange = (a) => {
applySelection(a, findB(a.key, listB));
};
// Trigger 3: user picks B
const handleBChange = (b) => {
setSelection((prev) => ({ ...prev, b: b.id }));
form.current?.setFieldsValue({ ...b.fields });
};
```
+57
View File
@@ -0,0 +1,57 @@
# Agent Instructions
This project keeps a single source of truth for agent/contributor conventions in [`CLAUDE.md`](./CLAUDE.md). **Read [`CLAUDE.md`](./CLAUDE.md) and follow it.**
@CLAUDE.md
## Downstream fork workflow
This repo is a **downstream fork** that customizes the product appearance on top of upstream `gpustack/gpustack-ui`. The mirror chain is:
```
upstream https://github.com/gpustack/gpustack-ui.git
| (fetch)
origin ssh://git@192.168.0.23:11022/root/gpustack-ui.git (private registry, also https://git.digiman.live)
```
### Goal
Track upstream releases. When upstream changes, we pull it in, then apply our own appearance/customization changes on a dedicated branch so we keep our look-and-feel on top of the latest upstream product.
### Branch naming
Customization work lives on `v<upstream-version>-lofyer` branches (e.g. `v2.2.0-lofyer`). Each time upstream ships a new version we want to follow, create a new `v<version>-lofyer` branch from the corresponding upstream tag/branch and re-apply (or rebase) our customizations onto it.
### Syncing from upstream
`scripts/sync-github` mirrors upstream into the private `origin` (full mirror, force push of all branches + tags). It auto-configures the `upstream` remote on first run.
```bash
# preview only, no push
DRY_RUN=1 ./scripts/sync-github
# real sync (force-pushes every upstream branch + tag to origin)
./scripts/sync-github
# also delete origin branches that no longer exist upstream (true mirror, destructive)
PRUNE_BRANCHES=1 ./scripts/sync-github
```
Env knobs: `UPSTREAM_URL`, `ORIGIN_REMOTE`, `UPSTREAM_REMOTE`, `PRUNE_BRANCHES`, `DRY_RUN`. After syncing, branch a fresh `v<version>-lofyer` off the updated upstream ref and apply the appearance changes there.
### Re-applying brand customizations
`scripts/rebrand` swaps the standalone brand word `GPUStack` for our brand (`MesaStack`) across user-facing text. It is the first appearance change to re-apply on every new `v<version>-lofyer` branch.
```bash
# preview hits, no writes
DRY_RUN=1 ./scripts/rebrand
# apply (default GPUStack -> MesaStack)
./scripts/rebrand
# custom brand words
FROM=GPUStack TO=AcmeStack ./scripts/rebrand
```
It deliberately **does not** touch functional references — lowercase `gpustack` (npm pkg / URLs / paths / k8s namespace), ALL-CAPS `GPUSTACK_*` constants, JS identifiers like `getGPUStackPlugin`, and `X-*` HTTP headers — and carries a line-level skip list for backend-contract strings matched at runtime (see `SKIP_LINE_PATTERNS` in the script). Always review `git diff` afterwards. Logo images under `src/assets/images/` are NOT changed by the script — replace those PNGs separately when new brand assets are available.
+46
View File
@@ -0,0 +1,46 @@
## Create form table list
## Create a form
## StatusTag
Use `StatusTag` from `@gpustack/core-ui` for status display. Do not use `Tag` from `antd` directly.
1. Define the mapping from business status values to UI status values in the module's `config/index.ts`:
```ts
import { StatusMaps } from '@/config';
import { StatusType } from '@/config/types';
export const XxxStatusValueMap = {
Running: 'running',
Pending: 'pending',
Failed: 'failed'
};
export const XxxStatusLabelMap: Record<string, string> = {
[XxxStatusValueMap.Running]: 'Running',
[XxxStatusValueMap.Pending]: 'Pending',
[XxxStatusValueMap.Failed]: 'Failed'
};
export const status: Record<string, StatusType> = {
[XxxStatusValueMap.Running]: StatusMaps.success,
[XxxStatusValueMap.Pending]: StatusMaps.transitioning,
[XxxStatusValueMap.Failed]: StatusMaps.error
};
```
2. In table columns, pass only the UI status value and display text required by `StatusTag`:
```tsx
<StatusTag
statusValue={{
status: status[value],
text: XxxStatusLabelMap[value] || value,
message: record.state_message
}}
/>
```
`statusValue.status` must be a value mapped from `StatusMaps`, such as `success`, `transitioning`, `warning`, `error`, or `inactive`. Do not pass business status values such as `running` or `pending` directly.
+190
View File
@@ -0,0 +1,190 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
Copyright (c) 2024 The GPUStack authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+13
View File
@@ -1,3 +1,7 @@
# MesaStack UI
UI for [MesaStack](https://github.com/gpustack/gpustack).
## Installation ## Installation
1. [Nodejs](https://nodejs.org/en) 16.0+(with NPM) 1. [Nodejs](https://nodejs.org/en) 16.0+(with NPM)
@@ -40,3 +44,12 @@ npm run dev
``` ```
npm run build npm run build
``` ```
## Bugs & Issues
- Please submit [bugs and issues](https://github.com/gpustack/gpustack/issues) with a label `ui`
## Links
- Official website: https://gpustack.ai/
- Documents: https://docs.gpustack.ai/latest/overview/
+32 -21
View File
@@ -1,9 +1,10 @@
import { defineConfig } from '@umijs/max'; import { defineConfig } from '@umijs/max';
import keepAlive from './keep-alive';
import { extraMfsuExclude } from './mfsu.extensions';
import { compressionPluginConfig, monacoPluginConfig } from './plugins';
import proxy from './proxy'; import proxy from './proxy';
import routes from './routes'; import routes from './routes';
import theme from './theme';
import { getBranchInfo } from './utils'; import { getBranchInfo } from './utils';
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const versionInfo = getBranchInfo(); const versionInfo = getBranchInfo();
process.env.VERSION = JSON.stringify(versionInfo); process.env.VERSION = JSON.stringify(versionInfo);
@@ -14,11 +15,26 @@ const isProduction = env === 'production';
const t = Date.now(); const t = Date.now();
export default defineConfig({ export default defineConfig({
proxy: { proxy: {
...proxy('http://192.168.50.166:8080') ...proxy(process.env.PROXY_HOST)
}, },
history: { history: {
type: 'hash' type: 'hash'
}, },
define: {
'process.env.ENABLE_ENTERPRISE': process.env.ENABLE_ENTERPRISE
},
analyze: {
analyzerMode: 'server',
analyzerPort: 8888,
openAnalyzer: true,
generateStatsFile: false,
statsFilename: 'stats.json',
logLevel: 'info',
defaultSizes: 'parsed' // stat // gzip
},
mfsu: {
exclude: ['lodash', 'ml-pca', ...extraMfsuExclude]
},
base: process.env.npm_config_base || '/', base: process.env.npm_config_base || '/',
...(isProduction ...(isProduction
? { ? {
@@ -44,38 +60,33 @@ export default defineConfig({
config.output config.output
.filename(`js/[name].${t}.js`) .filename(`js/[name].${t}.js`)
.chunkFilename(`js/[name].${t}.chunk.js`); .chunkFilename(`js/[name].${t}.chunk.js`);
config compressionPluginConfig(config);
.plugin('compression-webpack-plugin') monacoPluginConfig(config);
.use(CompressionWebpackPlugin, [
{
filename: '[path][base].gz',
algorithm: 'gzip',
test: /\.(js|css|html|svg)$/,
threshold: 10240,
minRatio: 0.8
}
]);
} }
} }
: {}), : {
chainWebpack(config) {
monacoPluginConfig(config);
}
}),
favicons: ['/static/favicon.png'], favicons: ['/static/favicon.png'],
jsMinifier: 'terser', jsMinifier: 'terser',
cssMinifier: 'cssnano', cssMinifier: 'cssnano',
presets: ['umi-presets-pro'], presets: ['umi-presets-pro'],
clickToComponent: {}, clickToComponent: {},
antd: { antd: {
style: 'less', style: 'less'
configProvider: {
componentSize: 'large',
theme
}
}, },
title: 'MesaStack',
hash: true, hash: true,
access: {}, access: {},
model: {}, model: {},
initialState: {}, initialState: {},
request: {}, request: {},
routePrefetch: {
defaultPrefetch: 'intent'
},
keepalive: keepAlive,
locale: { locale: {
antd: true, antd: true,
baseNavigator: true, baseNavigator: true,
+6
View File
@@ -0,0 +1,6 @@
export const keepAliveRoutes = {
text2images: '/playground/text-to-image',
speech: '/playground/speech'
};
export default [keepAliveRoutes.text2images, keepAliveRoutes.speech];
+9
View File
@@ -0,0 +1,9 @@
// Identity hook for build-time mfsu.exclude extensions. Tooling may
// overwrite this file to add package names that must skip MFSU's
// pre-bundling; the original is restored on cleanup. Mirrors
// `src/request.extensions.ts` / `src/access.extensions.ts`.
//
// MFSU bundles node_modules into immutable chunks at dev startup, so
// workspace-linked packages whose source you edit during dev must be
// excluded here or HMR won't pick up changes.
export const extraMfsuExclude: string[] = [];
+36
View File
@@ -0,0 +1,36 @@
import MonacoWebpackPlugin from 'monaco-editor-webpack-plugin';
const CompressionWebpackPlugin = require('compression-webpack-plugin');
export function monacoPluginConfig(config: any) {
return config
.plugin('monaco-editor-webpack-plugin')
.use(MonacoWebpackPlugin, [
{
languages: ['yaml'],
customLanguages: [
{
label: 'yaml',
entry: 'monaco-yaml',
worker: {
id: 'monaco-yaml/yamlWorker',
entry: 'monaco-yaml/yaml.worker.js'
}
}
]
}
]);
}
export function compressionPluginConfig(config: any) {
return config
.plugin('compression-webpack-plugin')
.use(CompressionWebpackPlugin, [
{
filename: '[path][base].gz',
algorithm: 'gzip',
test: /\.(js|css|html|svg)$/,
threshold: 10240,
minRatio: 0.8
}
]);
}
+13 -1
View File
@@ -1,4 +1,14 @@
const proxyTableList = ['cli', 'v1', 'auth', 'v1-openai', 'version']; const proxyTableList = [
'cli',
'v1',
'v2',
'auth',
'v1-openai',
'version',
'proxy',
'update',
'grafana'
];
// @ts-ingore // @ts-ingore
export default function createProxyTable(target?: string) { export default function createProxyTable(target?: string) {
@@ -10,6 +20,7 @@ export default function createProxyTable(target?: string) {
changeOrigin: true, changeOrigin: true,
secure: false, secure: false,
ws: true, ws: true,
log: 'debug',
pathRewrite: (pth: string) => pth.replace(`/^/${api}`, `/${api}`), pathRewrite: (pth: string) => pth.replace(`/^/${api}`, `/${api}`),
headers: { headers: {
origin: newTarget, origin: newTarget,
@@ -20,5 +31,6 @@ export default function createProxyTable(target?: string) {
}, },
{} {}
); );
return proxyTable; return proxyTable;
} }
+3
View File
@@ -0,0 +1,3 @@
// Identity hook for build-time route extensions. Tooling may overwrite
// this file to inject additional routes; the original is restored on cleanup.
export const applyRouteExtensions = <T>(base: T): T => base;
+390 -32
View File
@@ -1,62 +1,418 @@
export default [ import { keepAliveRoutes } from './keep-alive';
import { applyRouteExtensions } from './routes.extensions';
const baseRoutes = [
{ {
name: 'dashboard', name: 'dashboard',
path: '/dashboard', path: '/dashboard',
key: 'dashboard', key: 'dashboard',
icon: 'AppstoreOutlined', icon: 'icon-dashboard',
access: 'canSeeAdmin', selectedIcon: 'icon-dashboard-filled',
component: './dashboard' defaultIcon: 'icon-dashboard',
// `canSeeOrgAdmin` widens to anyone the access seam grants
// admin-ish visibility — by default platform admin, plus
// whatever the routes extension chooses to allow.
access: 'canSeeOrgAdmin',
component: './dashboard',
routes: []
}, },
{ {
name: 'playground', name: 'playground',
title: 'Playground', icon: 'icon-experiment',
selectedIcon: 'icon-experiment-filled',
defaultIcon: 'icon-experiment',
path: '/playground', path: '/playground',
key: 'playground', key: 'playground',
icon: 'Comment', routes: [
component: './playground' {
path: '/playground',
redirect: '/playground/chat'
},
{
name: 'chat',
title: 'Chat',
path: '/playground/chat',
key: 'chat',
icon: 'icon-chat',
selectedIcon: 'icon-chat-filled',
defaultIcon: 'icon-chat',
component: './playground/chat/index'
},
{
name: 'embedding',
title: 'embedding',
path: '/playground/embedding',
key: 'embedding',
icon: 'icon-embedding',
selectedIcon: 'icon-embedding-filled',
defaultIcon: 'icon-embedding',
component: './playground/embedding/index'
},
{
name: 'rerank',
title: 'Rerank',
path: '/playground/rerank',
key: 'rerank',
icon: 'icon-reranker',
selectedIcon: 'icon-reranker-filled',
defaultIcon: 'icon-reranker',
component: './playground/rerank/index'
},
{
name: 'text2images',
title: 'Text2Images',
path: keepAliveRoutes.text2images,
key: 'text2images',
icon: 'icon-image1',
selectedIcon: 'icon-image-filled',
defaultIcon: 'icon-image1',
component: './playground/images/index'
},
{
name: 'speech',
title: 'Speech',
path: keepAliveRoutes.speech,
key: 'speech',
icon: 'icon-audio1',
selectedIcon: 'icon-audio-filled',
defaultIcon: 'icon-audio1',
component: './playground/speech/index'
}
// {
// name: 'video',
// title: 'Video',
// path: '/playground/video',
// key: 'video',
// icon: 'icon-video-outline',
// hideInMenu: false,
// selectedIcon: 'icon-video-filled02',
// defaultIcon: 'icon-video-outline',
// component: './playground/video'
// }
]
}, },
{ {
name: 'models', name: 'models',
path: '/models', path: '/models',
key: 'models', key: 'models',
icon: 'Block', routes: [
access: 'canSeeAdmin', {
component: './llmodels' path: '/models',
redirect: '/models/deployments'
},
{
name: 'modelCatalog',
path: '/models/catalog',
key: 'modelsCatalog',
icon: 'icon-layers',
selectedIcon: 'icon-layers-filled',
defaultIcon: 'icon-layers',
access: 'canSeeOrgAdmin',
component: './llmodels/catalog'
},
{
name: 'userModels',
path: '/models/user-models',
key: 'userModels',
icon: 'icon-models',
selectedIcon: 'icon-models-filled',
defaultIcon: 'icon-models',
access: 'canSeeUser',
component: './llmodels/user-models'
},
{
name: 'deployment',
path: '/models/deployments',
key: 'modelDeployments',
icon: 'icon-rocket-launch1',
selectedIcon: 'icon-rocket-launch-fill',
defaultIcon: 'icon-rocket-launch1',
access: 'canSeeOrgAdmin',
component: './llmodels/index'
},
{
name: 'routes',
path: '/models/routes',
key: 'routes',
icon: 'icon-captive_portal',
selectedIcon: 'icon-captive_portal',
defaultIcon: 'icon-captive_portal',
access: 'canSeeOrgAdmin',
component: './model-routes/index'
},
{
name: 'providers',
path: '/models/providers',
key: 'modelProviders',
icon: 'icon-extension-outline',
selectedIcon: 'icon-extension-filled',
defaultIcon: 'icon-extension-outline',
access: 'canSeeOrgAdmin',
component: './maas-provider/index'
},
{
name: 'benchmark',
path: '/models/benchmark',
key: 'benchmark',
icon: 'icon-speed',
selectedIcon: 'icon-speed-filled',
defaultIcon: 'icon-speed',
access: 'canSeeOrgAdmin',
component: './benchmark/index'
},
{
name: 'benchmarkDetail',
path: '/models/benchmark/detail',
key: 'benchmarkDetail',
icon: 'icon-speed',
selectedIcon: 'icon-speed-filled',
defaultIcon: 'icon-speed',
access: 'canSeeOrgAdmin',
hideInMenu: true,
component: './benchmark/details'
},
{
name: 'backendsList',
path: '/models/backends',
key: 'backendsList',
icon: 'icon-backend',
selectedIcon: 'icon-backend-filled',
defaultIcon: 'icon-backend',
access: 'canSeeOrgAdmin',
component: './backends/index'
},
{
name: 'modelfiles',
path: '/models/modelfiles',
key: 'modelfiles',
icon: 'icon-files',
selectedIcon: 'icon-files-filled',
defaultIcon: 'icon-files',
access: 'canSeeOrgAdmin',
component: './resources/components/model-files'
}
]
},
{
name: 'gpuService',
path: '/gpu-service',
key: 'gpuService',
access: 'canSeeGpuService',
routes: [
{
path: '/gpu-service',
redirect: '/gpu-service/instances'
},
{
name: 'instances',
path: '/gpu-service/instances',
key: 'gpuServiceList',
icon: 'icon-cloud-outlined',
selectedIcon: 'icon-cloud-filled',
defaultIcon: 'icon-cloud-outlined',
component: './gpu-service/instances'
},
{
name: 'templates',
path: '/gpu-service/templates',
key: 'gpuServiceTemplates',
icon: 'icon-instance-template-outlined',
selectedIcon: 'icon-instance-template-filled',
defaultIcon: 'icon-instance-template-outlined',
component: './gpu-service/templates'
},
{
name: 'storage',
path: '/gpu-service/storage',
key: 'gpuServiceStorage',
icon: 'icon-database-outlined',
selectedIcon: 'icon-database-filled',
defaultIcon: 'icon-database-outlined',
component: './gpu-service/storage'
},
{
name: 'storageTypes',
path: '/gpu-service/storage-types',
key: 'gpuServiceStorageTypes',
icon: 'icon-storage-outlined',
// Storage types are tenant-scoped on the backend (Org owners
// can create/list their own), so the menu shouldn't be
// platform-admin-only. ``canSeeOrgAdmin`` keeps the gate at
// "admin or current-org owner" — Org members still don't see
// it, which matches the read/write model in the route.
access: 'canSeeOrgAdmin',
selectedIcon: 'icon-storage-filled',
defaultIcon: 'icon-storage-outlined',
component: './gpu-service/storage-types'
},
{
name: 'publicKeys',
path: '/gpu-service/public-keys',
key: 'gpuServicePublicKeys',
icon: 'icon-ssh-outlined',
selectedIcon: 'icon-ssh-filled',
defaultIcon: 'icon-ssh-outlined',
component: './gpu-service/public-keys'
}
]
}, },
{ {
name: 'resources', name: 'resources',
path: '/resources', path: '/resources',
key: 'resources', key: 'resources',
icon: 'CloudServer', access: 'canSeeOrgAdmin',
access: 'canSeeAdmin', routes: [
component: './resources' {
path: '/resources',
redirect: '/resources/workers'
},
{
name: 'clusters',
path: '/resources/clusters/list',
key: 'clusters',
icon: 'icon-cluster2-outline',
selectedIcon: 'icon-cluster2-filled',
defaultIcon: 'icon-cluster2-outline',
component: './cluster-management/clusters',
subMenu: ['/resources/clusters/detail', '/resources/clusters/create']
},
{
name: 'workers',
path: '/resources/workers',
key: 'workers',
icon: 'icon-resources',
selectedIcon: 'icon-resources-filled',
defaultIcon: 'icon-resources',
component: './resources/components/workers'
},
{
name: 'gpus',
path: '/resources/gpus',
key: 'gpus',
icon: 'icon-gpu1',
selectedIcon: 'icon-gpu-filled',
defaultIcon: 'icon-gpu1',
component: './resources/components/gpus'
},
{
name: 'credentials',
path: '/resources/credentials',
key: 'credentials',
icon: 'icon-credential-outline',
selectedIcon: 'icon-credential-filled',
defaultIcon: 'icon-credential-outline',
component: './cluster-management/credentials'
},
{
name: 'clusterDetail',
path: '/resources/clusters/detail',
key: 'clusterDetail',
icon: 'icon-cluster2-outline',
selectedIcon: 'icon-cluster2-filled',
defaultIcon: 'icon-cluster2-outline',
hideInMenu: true,
component: './cluster-management/cluster-detail'
}
]
},
{
// Cross-resource consumption (tokens + GPU/CPU instances + storage).
// A folder so it matches the other top-level groups; more usage views can
// graduate in here later.
name: 'billingAndUsage',
path: '/usage',
key: 'usageGroup',
icon: 'icon-usage-outlined',
selectedIcon: 'icon-usage-filled',
defaultIcon: 'icon-usage-outlined',
routes: [
{
path: '/usage',
redirect: '/usage/overview'
},
{
name: 'usage',
path: '/usage/overview',
key: 'usage',
icon: 'icon-usage-outlined',
selectedIcon: 'icon-usage-filled',
defaultIcon: 'icon-usage-outlined',
component: './usage/index'
},
{
name: 'billing',
path: '/usage/billing',
key: 'billing',
icon: 'icon-billing-outlined',
selectedIcon: 'icon-billing-filled',
defaultIcon: 'icon-billing-outlined',
hideInMenu: process.env.ENABLE_ENTERPRISE === 'true',
// OSS exposes the menu as a teaser for the enterprise billing
// module. The page itself just renders an upsell notice — the real
// billing UI lives in the enterprise plugin and shadows this route
// via `routes.extensions.ts`.
component: './billing'
}
]
},
{
name: 'accessControl',
path: '/access-control',
key: 'accessControl',
routes: [
{
path: '/access-control',
redirect: '/access-control/users'
},
{
name: 'organizations',
path: '/access-control/organizations',
key: 'organizations',
icon: 'icon-org-outlined',
selectedIcon: 'icon-org-filled',
defaultIcon: 'icon-org-outlined',
// OSS exposes the menu to platform admins as a teaser for the
// enterprise multi-tenancy module. The page itself just renders
// an upsell notice — the real CRUD UI lives in the enterprise
// plugin and shadows this route via `routes.extensions.ts`.
access: 'canSeeAdmin',
component: './organizations'
},
{
name: 'users',
path: '/access-control/users',
key: 'users',
icon: 'icon-users',
selectedIcon: 'icon-users-filled',
defaultIcon: 'icon-users',
access: 'canSeeAdmin',
component: './users'
},
{
name: 'apikeys',
path: '/access-control/api-keys',
key: 'apikeys',
selectedIcon: 'icon-key-filled',
icon: 'icon-key',
defaultIcon: 'icon-key',
component: './api-keys'
}
]
}, },
// {
// name: 'usage',
// path: '/usage',
// key: 'usage',
// icon: 'BarChartOutlined',
// component: './usage'
// },
{ {
name: 'apikeys', name: 'apikeys',
path: '/api-keys', path: '/api-keys',
key: 'apikeys', key: 'apikeys',
icon: 'LockOutlined', hideInMenu: true,
selectedIcon: 'icon-key-filled',
icon: 'icon-key',
defaultIcon: 'icon-key',
component: './api-keys' component: './api-keys'
}, },
{
name: 'users',
path: '/users',
key: 'users',
icon: 'Team',
access: 'canSeeAdmin',
component: './users'
},
{ {
name: 'profile', name: 'profile',
path: '/profile', path: '/preferences',
key: 'profile', key: 'preferences',
hideInMenu: true, hideInMenu: true,
component: './profile', component: './profile',
icon: 'User' icon: 'User'
@@ -73,7 +429,9 @@ export default [
name: '404', name: '404',
path: '*', path: '*',
key: '404', key: '404',
layout: false, hideInMenu: true,
component: './404' component: './404'
} }
]; ];
export default applyRouteExtensions(baseRoutes);
-49
View File
@@ -1,49 +0,0 @@
export default {
'root-entry-name': 'variable',
cssVar: true,
hashed: false,
components: {
Input: {
inputFontSize: 12
},
Table: {
cellFontSize: 12,
rowSelectedHoverBg: 'rgba(230, 230, 230, 0.88)',
rowSelectedBg: 'rgb(244, 245, 244)'
},
Menu: {
iconSize: 16,
iconMarginInlineEnd: 12,
itemHeight: 44,
itemColor: 'rgba(0,0,0,1)',
itemHoverBg: 'rgba(0,0,0,0.04)',
itemActiveBg: 'rgba(0,0,0,0.04)'
},
Progress: {
lineBorderRadius: 4
},
Select: {
itemSelectedBg: 'rgba(0,0,0,0.06)'
},
Message: {
contentPadding: '12px 16px'
},
Slider: {
handleSize: 8,
handleSizeHover: 8,
trackBg: 'rgba(0,0,0,0.15)',
handleColor: 'rgba(0,0,0,0.2)',
trackHoverBg: 'rgba(0,0,0,0.25)',
handleActiveColor: 'rgba(0,0,0,0.3)',
dotActiveBorderColor: 'rgba(0,0,0,0.25)',
handleActiveOutlineColor: 'rgba(0,0,0,0.25)',
dotBorderColor: 'rgba(0,0,0,0.25)'
}
},
token: {
colorPrimary: '#007BFF',
borderRadius: 8,
fontSize: 12,
motion: true
}
};
+24 -10
View File
@@ -1,13 +1,27 @@
const child_process = require('child_process'); import { execSync } from 'child_process';
export const getBranchInfo = () => { export const getBranchInfo = () => {
const latestCommit = child_process // git may be absent (source archive, bare container) or this tree may
.execSync('git rev-parse HEAD') // not be a git checkout. Swallow the failure and fall back to the env
.toString() // overrides below — losing build info shouldn't fail the build.
.trim(); let latestCommit = '';
const versionTag = child_process let versionTag = '';
.execSync(`git tag --contains ${latestCommit}`) try {
.toString() latestCommit = execSync('git rev-parse HEAD').toString().trim();
.trim(); versionTag = execSync(`git tag --contains ${latestCommit}`)
return { version: versionTag || '', commitId: latestCommit.slice(0, 7) }; .toString()
.trim();
} catch {
// Not a git checkout / git unavailable; rely on env overrides.
}
// Respect explicit GPUSTACK_UI_* overrides so a wrapping build that
// checks this source tree out as a sub-package can stamp its own
// release tag and commit id onto the UI (otherwise the panel reports
// the host tree's git HEAD, which the wrapper doesn't control).
const overrideVersion = process.env.GPUSTACK_UI_VERSION?.trim();
const overrideCommitId = process.env.GPUSTACK_UI_COMMIT_ID?.trim();
return {
version: overrideVersion || versionTag || '',
commitId: overrideCommitId || latestCommit.slice(0, 7)
};
}; };
+79
View File
@@ -0,0 +1,79 @@
import js from '@eslint/js';
import prettier from 'eslint-config-prettier';
import importPlugin from 'eslint-plugin-import';
import reactPlugin from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import unusedImports from 'eslint-plugin-unused-imports';
import { defineConfig, globalIgnores } from 'eslint/config';
import globals from 'globals';
import tseslint from 'typescript-eslint';
export default defineConfig([
globalIgnores([
'public/static/',
'dist',
'src/.umi/',
'src/.umi-production/',
'src/.umi-test/',
'src/components/iconfont/'
]),
{
files: ['**/*.{ts,tsx,js,jsx}'],
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs.flat.recommended,
prettier
],
plugins: {
react: reactPlugin,
import: importPlugin,
'unused-imports': unusedImports
},
settings: {
react: {
version: 'detect'
},
'import/resolver': {
node: true,
typescript: true
}
},
languageOptions: {
ecmaVersion: 2020,
globals: {
...globals.browser,
...globals.node,
Global: 'readonly',
React: 'readonly',
JSX: 'readonly'
}
},
rules: {
'react/no-unstable-nested-components': 'warn',
'no-unused-vars': 'off',
'no-undef': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/no-empty-object-type': 'off',
'@typescript-eslint/no-unnecessary-type-constraint': 'off',
'unused-imports/no-unused-imports': 'error',
'unused-imports/no-unused-vars': 'off',
'import/no-unresolved': 'off',
'import/no-duplicates': 'error',
'react-hooks/exhaustive-deps': 'off',
'react-hooks/preserve-manual-memoization': 'off',
'react-hooks/set-state-in-effect': 'off',
'react-hooks/refs': 'off',
'react-hooks/use-memo': 'off',
'react-hooks/immutability': 'off',
'no-unsafe-optional-chaining': 'off',
'no-empty': 'off',
'no-constant-condition': 'off',
'no-prototype-builtins': 'off',
'no-multiple-empty-lines': ['error', { max: 1, maxEOF: 0, maxBOF: 0 }]
}
}
]);
+27
View File
@@ -1 +1,28 @@
// only for third party libraries styles // only for third party libraries styles
.simplebar-scrollbar.simplebar-visible::before {
opacity: 1;
}
.simplebar-scrollbar::before {
background: var(--scrollbar-handle-bg);
width: var(--scrollbar-size);
}
.simplebar-scrollbar.simplebar-visible.simplebar-hover {
&::before {
background: var(--scrollbar-handle-hover-bg);
}
}
.simplebar-scrollbar.scrollbar-handle-light {
&::before {
background-color: var(--scrollbar-handle-light-bg);
}
}
.simplebar-scrollbar.simplebar-visible.simplebar-hover.scrollbar-handle-light {
&::before {
background: var(--scrollbar-handle-light-bg);
}
}
+68 -11
View File
@@ -1,72 +1,129 @@
{ {
"private": true, "private": true,
"author": "jialin <jialinkuang@126.com>", "author": "gpustack",
"scripts": { "scripts": {
"build": "max build", "build": "max build",
"check:locales": "node --import tsx ./src/locales/check.ts",
"dev": "max dev", "dev": "max dev",
"format": "prettier --cache --write .", "format": "prettier --cache --write .",
"postinstall": "max setup", "postinstall": "max setup",
"prepare": "husky", "prepare": "husky",
"preview": "max preview",
"setup": "max setup", "setup": "max setup",
"start": "npm run dev" "start": "npm run dev"
}, },
"dependencies": { "dependencies": {
"@ant-design/icons": "^5.3.7", "@ant-design/icons": "^6.1.0",
"@ant-design/pro-components": "^2.7.1", "@ant-design/pro-components": "3.1.0-0",
"@antv/g6": "^5.0.51",
"@braintree/sanitize-url": "^7.1.1",
"@gpustack/core-ui": "^1.0.27",
"@huggingface/gguf": "^0.1.7", "@huggingface/gguf": "^0.1.7",
"@huggingface/hub": "^0.15.1", "@huggingface/hub": "^0.15.1",
"@huggingface/tasks": "^0.11.6", "@huggingface/tasks": "^0.11.6",
"@monaco-editor/react": "^4.6.0", "@monaco-editor/react": "^4.6.0",
"@orcid/bibtex-parse-js": "^0.0.25",
"@react-hook/resize-observer": "^2.0.2", "@react-hook/resize-observer": "^2.0.2",
"@types/lodash": "^4.17.4", "@types/lodash": "^4.17.4",
"@umijs/max": "^4.2.11", "@umijs/max": "^4.6.15",
"@xterm/addon-fit": "^0.10.0", "@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0", "@xterm/xterm": "^5.5.0",
"ahooks": "^3.8.5",
"ansi-to-html": "^0.7.2", "ansi-to-html": "^0.7.2",
"antd": "^5.18.3", "antd": "^6.3.3",
"antd-style": "^3.6.2", "antd-style": "^3.6.2",
"axios": "^1.7.2", "axios": "^1.8.2",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"culori": "^4.0.2",
"dayjs": "^1.11.11", "dayjs": "^1.11.11",
"dompurify": "^3.2.6",
"driver.js": "^1.3.1",
"echarts": "^5.5.1", "echarts": "^5.5.1",
"file-saver": "^2.0.5",
"has-ansi": "^5.0.1", "has-ansi": "^5.0.1",
"highlight.js": "^11.10.0", "highlight.js": "^11.10.0",
"jdenticon": "^3.3.0",
"jotai": "^2.8.4", "jotai": "^2.8.4",
"js-yaml": "^4.1.0",
"katex": "^0.16.21",
"lamejs": "github:zhuker/lamejs",
"localforage": "^1.10.0", "localforage": "^1.10.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"marked": "^14.1.0", "marked": "^14.1.0",
"minimatch": "^3.1.2",
"ml-dataset-iris": "^1.2.1",
"ml-pca": "^4.1.1",
"monaco-editor": "^0.30.1",
"monaco-yaml": "^4.0.0",
"numeral": "^2.0.6", "numeral": "^2.0.6",
"overlayscrollbars": "^2.10.0",
"overlayscrollbars-react": "^0.5.6",
"query-string": "^9.0.0", "query-string": "^9.0.0",
"rc-resize-observer": "^1.4.3",
"rc-virtual-list": "^3.14.8",
"re-resizable": "^6.10.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-hotkeys-hook": "^4.5.0", "react-hotkeys-hook": "^4.5.0",
"react-intersection-observer": "^9.16.0",
"react-markdown": "^9.0.3",
"react-router-dom": "^6.30.3",
"rehype-katex": "^7.0.1",
"remark-breaks": "^4.0.0",
"remark-gfm": "^4.0.1",
"remark-math": "^6.0.0",
"semver": "^7.7.3",
"simplebar-react": "^3.2.6", "simplebar-react": "^3.2.6",
"umi-presets-pro": "^2.0.3" "styled-components": "^6.1.15",
"umi-presets-pro": "^2.0.3",
"wavesurfer.js": "^7.8.8"
}, },
"devDependencies": { "devDependencies": {
"@types/marked": "^6.0.0", "@eslint/js": "^9.39.4",
"@types/node": "^25.0.3",
"@types/react": "^18.3.1", "@types/react": "^18.3.1",
"@types/react-dom": "^18.3.0", "@types/react-dom": "^18.3.0",
"@types/semver": "^7.7.1",
"@typescript-eslint/eslint-plugin": "^8.58.1",
"@umijs/case-sensitive-paths-webpack-plugin": "^1.0.1", "@umijs/case-sensitive-paths-webpack-plugin": "^1.0.1",
"@umijs/plugins": "^4.4.11",
"babel-plugin-named-asset-import": "^0.3.8", "babel-plugin-named-asset-import": "^0.3.8",
"case-sensitive-paths-webpack-plugin": "^2.4.0", "case-sensitive-paths-webpack-plugin": "^2.4.0",
"compression-webpack-plugin": "^11.1.0", "compression-webpack-plugin": "^11.1.0",
"cross-env": "^7.0.3",
"css-loader": "^7.1.2", "css-loader": "^7.1.2",
"eslint": "^8.56.0", "eslint": "^9.39.4",
"eslint-plugin-unused-imports": "^3.2.0", "eslint-config-prettier": "^10.1.8",
"eslint-import-resolver-typescript": "^4.4.4",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-unused-imports": "^4.4.1",
"extract-css-loader": "^0.0.1", "extract-css-loader": "^0.0.1",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"globals": "^17.4.0",
"husky": "^9.0.11", "husky": "^9.0.11",
"less-loader": "^12.2.0", "less-loader": "^12.2.0",
"lint-staged": "^15.2.2", "lint-staged": "^15.2.2",
"mini-css-extract-plugin": "^2.9.0", "mini-css-extract-plugin": "^2.9.0",
"monaco-editor-webpack-plugin": "^4.2.0",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"prettier-plugin-organize-imports": "^3.2.4", "prettier-plugin-organize-imports": "^3.2.4",
"prettier-plugin-packagejson": "^2.5.0", "prettier-plugin-packagejson": "^2.5.0",
"prettier-plugin-two-style-order": "^1.0.1", "prettier-plugin-two-style-order": "^1.0.1",
"tsx": "^4.19.3",
"typescript": "^5.4.5", "typescript": "^5.4.5",
"url-loader": "^4.1.1" "typescript-eslint": "^8.58.0",
"url-loader": "^4.1.1",
"webpack-bundle-analyzer": "^4.10.2",
"worker-loader": "^3.0.8"
},
"packageManager": "pnpm@9.3.0",
"pnpm": {
"overrides": {
"elliptic": "^6.6.1"
}
} }
} }
+6 -3
View File
@@ -4,11 +4,14 @@ export default (api: IApi) => {
api.modifyHTML(($) => { api.modifyHTML(($) => {
const info = JSON.parse(process.env.VERSION || '{}'); const info = JSON.parse(process.env.VERSION || '{}');
const env = process.env.NODE_ENV; const env = process.env.NODE_ENV;
$('html').attr('lang', 'en');
$('html').attr('data-env', env);
$('html').attr( $('html').attr(
'data-version', 'data-version',
env === 'production' env === 'production' ? info.version || info.commitId : `${info.commitId}`
? info.version || info.commitId
: `dev-${info.commitId}`
); );
if (env === 'production') { if (env === 'production') {
$('script[src^="/js/umi"]').first?.().remove?.(); $('script[src^="/js/umi"]').first?.().remove?.();
+16332 -13772
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+102
View File
@@ -0,0 +1,102 @@
#!/bin/bash
#
# rebrand: 把面向用户的品牌标识从 GPUStack 批量替换为 MesaStack(或自定义品牌)。
#
# 设计目标:上游每次更新后,在新的 v<version>-lofyer 分支上跑一次即可重新应用品牌定制。
#
# 只替换「独立的品牌词」FROM,并刻意跳过所有功能性引用:
# - 小写 `gpustack` —— npm 包名 (@gpustack/core-ui)、URL、路径、k8s 命名空间、author(大小写敏感,天然不匹配)
# - 全大写 `GPUSTACK` —— 常量/环境变量/全局 (GPUSTACK_API_BASE_URL, __GPUSTACK_*__, GPUSTACK_UI_*)(大小写敏感,不匹配)
# - 代码标识符 —— getGPUStackPlugin / GPUStackVersionAtom / GPUStackPluginManager / GPUStackLogo 等
# (FROM 紧邻字母时视为标识符的一部分,跳过)
# - HTTP 头 X-GPUStack-* —— 后端契约 (如 X-GPUStack-Model),跳过
#
# 匹配规则:FROM 前后都不是字母(独立单词),且不是 `X-` 前缀的头名。
#
# 环境变量:
# FROM 源品牌词(默认 GPUStack
# TO 目标品牌词(默认 MesaStack
# DRY_RUN 设为 1 时只预览将改动的行,不写文件
#
set -e
FROM="${FROM:-GPUStack}"
TO="${TO:-MesaStack}"
DRY_RUN="${DRY_RUN:-0}"
log() { echo -e "\033[1;34m[rebrand]\033[0m $*"; }
# 大小写敏感、单词边界、排除 X- 头前缀的 Perl 正则。
# (?<![A-Za-z]) 前面不是字母 (?<!X-) 不是 X- 头 (?![A-Za-z]) 后面不是字母
# FROM 为纯字母品牌词(无正则元字符),故直接拼接,不用 \Q\E
# —— \Q\E 在「经变量插值进正则」时不会被求值,反而会破坏匹配。
PATTERN="(?<![A-Za-z])(?<!X-)${FROM}(?![A-Za-z])"
# 行级排除:某些 FROM 出现在「与后端契约绑定的字符串」里,改了会破坏运行时逻辑,
# 即使是独立单词也必须整行跳过。命中下列任一正则的行不替换。
# 已知例外:
# - llmodels/hooks/index.ts 用 startsWith() 比对后端返回的英文兼容性消息
# "... does not exist on the GPUStack server ..."),后端仍发 GPUStack,前端不能改。
SKIP_LINE_PATTERNS=(
'does not exist on the .*server. It'"'"'s recommended'
)
skip_line() {
local line="$1" pat
for pat in "${SKIP_LINE_PATTERNS[@]}"; do
if echo "$line" | grep -qP "$pat"; then return 0; fi
done
return 1
}
# 待处理的已跟踪文本文件(排除 lockfile 与本脚本自身)。
mapfile -t files < <(
git ls-files -- \
'*.ts' '*.tsx' '*.js' '*.jsx' '*.json' '*.less' '*.html' '*.md' \
| grep -v 'pnpm-lock.yaml'
)
log "品牌替换: '${FROM}' -> '${TO}'"
log "候选文件: ${#files[@]}"
# 把行级排除合并成一个 perl 正则,供预览与替换共用(经环境变量传入,免去转义)。
SKIP_RE=""
for pat in "${SKIP_LINE_PATTERNS[@]}"; do
SKIP_RE="${SKIP_RE:+${SKIP_RE}|}(?:${pat})"
done
export REBRAND_SKIP_RE="${SKIP_RE}"
export REBRAND_PATTERN="${PATTERN}"
export REBRAND_TO="${TO}"
# 统计命中行(预览/确认用),已扣除被行级排除的行。
log "命中行预览(最多 40 行):"
grep -rnP "${PATTERN}" "${files[@]}" 2>/dev/null \
| { [[ -n "${SKIP_RE}" ]] && grep -vP "${SKIP_RE}" || cat; } \
| head -40 || true
total=$(grep -rnP "${PATTERN}" "${files[@]}" 2>/dev/null \
| { [[ -n "${SKIP_RE}" ]] && grep -vP "${SKIP_RE}" || cat; } | wc -l)
log "命中总行数: ${total}"
if [[ -n "${SKIP_RE}" ]]; then
skipped=$(grep -rnP "${PATTERN}" "${files[@]}" 2>/dev/null | grep -cP "${SKIP_RE}" || true)
log "行级排除(后端契约,保留 ${FROM}: ${skipped} 行"
fi
if [[ "${DRY_RUN}" == "1" ]]; then
log "DRY_RUN=1:未写入任何文件。"
exit 0
fi
# 实际替换(in-place)。命中行级排除的行整行跳过。
changed=0
for f in "${files[@]}"; do
if grep -qP "${PATTERN}" "$f" 2>/dev/null; then
perl -i -pe '
my $skip = $ENV{REBRAND_SKIP_RE};
next if length($skip) && /$skip/;
s/$ENV{REBRAND_PATTERN}/$ENV{REBRAND_TO}/g;
' "$f"
changed=$((changed + 1))
fi
done
log "已修改文件数: ${changed}"
log "完成。请用 'git diff' 复核改动。"
+32
View File
@@ -0,0 +1,32 @@
const fs = require('fs');
const path = require('path');
const { spawnSync } = require('child_process');
const pnpmDir = path.resolve(__dirname, '../../../node_modules/.pnpm');
function findDir(prefix) {
return fs.readdirSync(pnpmDir).find((name) => name.startsWith(prefix));
}
const stylelintDir = findDir('stylelint@14.8.2');
if (!stylelintDir) {
console.error('Compatible stylelint@14.8.2 not found in workspace node_modules/.pnpm');
process.exit(1);
}
const stylelintBin = path.join(
pnpmDir,
stylelintDir,
'node_modules/stylelint/bin/stylelint.js'
);
const result = spawnSync(process.execPath, [stylelintBin, ...process.argv.slice(2)], {
stdio: 'inherit',
cwd: process.cwd(),
});
if (result.error) {
console.error(result.error);
}
process.exit(result.status ?? 1);
+83
View File
@@ -0,0 +1,83 @@
#!/bin/bash
#
# sync-github: 从上游 GitHub 拉取最新源码,并全量镜像同步到 192.168.0.23 私有源。
#
# 默认行为(全量镜像 / 强制):
# 1. 确保存在 upstream remote 指向 GitHub(不存在则自动添加,URL 不一致则更新)。
# 2. 从 upstream 抓取所有分支与 tag(--prune 清理已删除的远端引用)。
# 3. 将上游每个分支强制推送到私有源同名分支(force push)。
# 4. 将上游所有 tag 强制推送到私有源。
#
# 可用环境变量:
# UPSTREAM_URL 上游 GitHub 仓库地址(默认 https://github.com/gpustack/gpustack-ui.git
# ORIGIN_REMOTE 私有源 remote 名称(默认 origin
# UPSTREAM_REMOTE 上游 remote 名称(默认 upstream
# PRUNE_BRANCHES 设为 1 时,删除私有源上「上游已不存在」的分支(真·镜像,破坏性,默认关闭)
# DRY_RUN 设为 1 时,仅打印将要执行的推送动作,不实际推送
#
set -e
UPSTREAM_URL="${UPSTREAM_URL:-https://github.com/gpustack/gpustack-ui.git}"
ORIGIN_REMOTE="${ORIGIN_REMOTE:-origin}"
UPSTREAM_REMOTE="${UPSTREAM_REMOTE:-upstream}"
PRUNE_BRANCHES="${PRUNE_BRANCHES:-0}"
DRY_RUN="${DRY_RUN:-0}"
log() { echo -e "\033[1;34m[sync-github]\033[0m $*"; }
warn() { echo -e "\033[1;33m[sync-github]\033[0m $*" >&2; }
run() {
if [[ "${DRY_RUN}" == "1" ]]; then
echo " (dry-run) git $*"
else
git "$@"
fi
}
# 1. 确保 upstream remote 指向 GitHub。
if git remote get-url "${UPSTREAM_REMOTE}" >/dev/null 2>&1; then
current_url=$(git remote get-url "${UPSTREAM_REMOTE}")
if [[ "${current_url}" != "${UPSTREAM_URL}" ]]; then
log "更新 ${UPSTREAM_REMOTE} 地址: ${current_url} -> ${UPSTREAM_URL}"
git remote set-url "${UPSTREAM_REMOTE}" "${UPSTREAM_URL}"
fi
else
log "添加 upstream remote: ${UPSTREAM_REMOTE} -> ${UPSTREAM_URL}"
git remote add "${UPSTREAM_REMOTE}" "${UPSTREAM_URL}"
fi
origin_url=$(git remote get-url "${ORIGIN_REMOTE}")
log "上游 (拉取): ${UPSTREAM_URL}"
log "私有源 (推送): ${origin_url}"
# 2. 抓取上游所有分支与 tag。
log "抓取上游分支与 tag..."
git fetch --prune --tags "${UPSTREAM_REMOTE}"
# 3. 逐个分支强制推送到私有源。
log "强制同步分支到私有源..."
upstream_branches=$(git for-each-ref --format='%(refname:strip=3)' "refs/remotes/${UPSTREAM_REMOTE}/" | grep -v '^HEAD$')
for branch in ${upstream_branches}; do
log " -> ${branch}"
run push --force "${ORIGIN_REMOTE}" \
"refs/remotes/${UPSTREAM_REMOTE}/${branch}:refs/heads/${branch}"
done
# 4. 强制同步所有 tag。
log "强制同步 tag 到私有源..."
run push --force --tags "${ORIGIN_REMOTE}"
# 5. 可选:删除私有源上、上游已不存在的分支(真·镜像)。
if [[ "${PRUNE_BRANCHES}" == "1" ]]; then
warn "PRUNE_BRANCHES=1:将删除私有源上上游已不存在的分支"
origin_branches=$(git ls-remote --heads "${ORIGIN_REMOTE}" | sed 's@.*refs/heads/@@')
for branch in ${origin_branches}; do
if ! echo "${upstream_branches}" | grep -qx "${branch}"; then
warn " 删除私有源分支: ${branch}"
run push "${ORIGIN_REMOTE}" --delete "${branch}"
fi
done
fi
log "同步完成。"
+14
View File
@@ -0,0 +1,14 @@
// Identity hook for build-time access-predicate extensions. Tooling may
// overwrite this file to widen predicates; the original is restored on
// cleanup. Mirrors `config/routes.extensions.ts`.
export type AccessPredicates = {
canSeeAdmin: boolean;
canSeeOrgAdmin: boolean;
canManageCurrentOrg: boolean;
canSeeUser: boolean;
canDelete: boolean;
canLogin: boolean;
};
export const applyAccessExtensions = <T extends AccessPredicates>(base: T): T =>
base;
+49 -5
View File
@@ -1,12 +1,56 @@
export default (initialState: { currentUser?: Global.UserInfo }) => { import { applyAccessExtensions } from './access.extensions';
const canSeeAdmin = !!(
export default (initialState: {
currentUser?: Global.UserInfo;
hasKubernetesCluster?: boolean;
hasResourceEvents?: boolean;
}) => {
const isPlatformAdmin = !!(
initialState && initialState &&
initialState.currentUser && initialState.currentUser &&
initialState.currentUser.is_admin initialState.currentUser.is_admin
); );
return { const canSeeUser = !!(
canSeeAdmin, initialState &&
initialState.currentUser &&
!initialState.currentUser.is_admin
);
// GPU Service is Kubernetes-only. We only gate visibility down when
// the probe in `getInitialState` came back with a definitive answer;
// `undefined` (probe failed / not yet ready) collapses to the
// role-based default so a transient network blip can't lock anyone
// out of the menu.
const hasKubernetesCluster = initialState?.hasKubernetesCluster;
// Having run GPU/CPU instances or storage (any resource_events) also unlocks
// GPU Service / the full Usage page — a user who used it keeps seeing it even
// without a current cluster. MaaS-only users (no cluster, no events) don't.
const hasResourceEvents = !!initialState?.hasResourceEvents;
// Predicate roles, top-down by strictness:
// * `canSeeAdmin` — strictly platform admin (`users.is_admin`).
// Gates Users.
// * `canSeeOrgAdmin` — admin-style menus that work cross-org
// (Dashboard, Resources, Models, Cluster Management). Defaults
// to platform admin; extensions widen to include org admins.
// * `canSeeGpuService` — GPU Service menu. Anyone allowed to
// manage clusters (admins, Org owners) sees it; non-admins fall
// through to "show only if a Kubernetes cluster is actually
// reachable" so Org members without scheduling access don't see
// a dead-end menu item.
// * `canManageCurrentOrg` — pages that only make sense inside a
// specific org context (member / group management). Defaults to
// `false`; extensions widen when both an org is selected AND
// the caller is admin of it.
// Pass through `applyAccessExtensions` so build-time tooling can
// widen these without editing this file. Default is a no-op.
return applyAccessExtensions({
canSeeAdmin: isPlatformAdmin,
canSeeOrgAdmin: isPlatformAdmin,
canSeeGpuService:
isPlatformAdmin || hasKubernetesCluster !== false || hasResourceEvents,
canManageCurrentOrg: false,
canSeeUser,
canDelete: true, canDelete: true,
canLogin: true canLogin: true
}; });
}; };
+218 -14
View File
@@ -1,29 +1,215 @@
import { GPUStackVersionAtom } from '@/atoms/user'; import { userSettingsHelperAtom } from '@/atoms/settings';
import { GPUStackVersionAtom, UpdateCheckAtom, userAtom } from '@/atoms/user';
import { setAtomStorage } from '@/atoms/utils'; import { setAtomStorage } from '@/atoms/utils';
import { DEFAULT_ENTER_PAGE, GPUSTACK_API_BASE_URL } from '@/config/settings';
import { COLOR_PRIMARY } from '@/config/theme/constants';
import { queryClusterList } from '@/pages/cluster-management/apis';
import { ProviderValueMap } from '@/pages/cluster-management/config';
import { queryResourceEvents } from '@/pages/usage/apis/resource';
import { getGPUStackPlugin } from '@/plugins';
import { enterprisePluginReady } from '@/plugins/enterprise-ready';
import { GPUStackPluginManager } from '@/plugins/manager';
import { requestConfig } from '@/request-config'; import { requestConfig } from '@/request-config';
import { import {
queryCurrentUserState, queryCurrentUserState,
queryVersionInfo queryVersionInfo,
updateCheck
} from '@/services/profile/apis'; } from '@/services/profile/apis';
import { RequestConfig, history } from '@umijs/max'; import { fetchSystemConfig } from '@/services/system/query-system-config';
import { isOnline } from '@/utils';
import { installTenantFetch } from '@/utils/install-fetch';
import {
IS_FIRST_LOGIN,
readState,
writeState
} from '@/utils/localstore/index';
import '@gpustack/core-ui/style.css';
import { RequestConfig, history, request as umiRequest } from '@umijs/max';
import { message } from 'antd';
const loginPath = '/login'; installTenantFetch();
// only for the first login and access from http://localhost
const checkDefaultPage = async (userInfo: any) => {
const isFirstLogin = await readState(IS_FIRST_LOGIN);
if (isFirstLogin === null && isOnline()) {
writeState(IS_FIRST_LOGIN, true);
if (userInfo && userInfo?.is_admin) {
history.push(DEFAULT_ENTER_PAGE.adminForFirst);
}
}
};
// Probes the caller's cluster list once so access predicates can gate
// GPU Service (Kubernetes-only). Cheap (one list request) and never
// blocks login — any failure just falls back to `undefined`, which
// the predicate treats as "unknown / don't restrict beyond role".
// The result is also mirrored into sessionStorage so access extensions
// that run without the initialState argument can read it (e.g. to
// override the admin shortcut in scopes where the menu shouldn't
// show even for admins).
const HAS_K8S_CLUSTER_KEY = 'hasKubernetesCluster';
const probeHasKubernetesCluster = async (): Promise<boolean | undefined> => {
try {
const res = await queryClusterList(
{ page: -1 },
{
skipErrorHandler: true
}
);
const value = (res?.items ?? []).some(
(c) => c?.provider === ProviderValueMap.Kubernetes
);
try {
window.sessionStorage.setItem(HAS_K8S_CLUSTER_KEY, JSON.stringify(value));
} catch {
// sessionStorage may be unavailable (Safari private mode); the
// access predicate already handles a missing value as "unknown".
}
return value;
} catch (error) {
console.error('probeHasKubernetesCluster error', error);
try {
window.sessionStorage.removeItem(HAS_K8S_CLUSTER_KEY);
} catch {
// ignore
}
return undefined;
}
};
// Probes whether the caller has ANY resource-usage events (GPU/CPU instance or
// storage lifecycle). Used alongside the cluster probe so a user who has run
// GPU instances still sees GPU Service / the full Usage page even if they
// currently have no Kubernetes cluster. Mirrored into sessionStorage for the
// access extensions; any failure → undefined ("unknown — don't restrict").
const HAS_RESOURCE_EVENTS_KEY = 'hasResourceEvents';
const probeHasResourceEvents = async (): Promise<boolean | undefined> => {
try {
// No date range = "ever"; scope is clamped to the caller server-side.
const res = await queryResourceEvents(
{ perPage: 1 },
{
skipErrorHandler: true
}
);
const value = (res?.pagination?.total ?? 0) > 0;
try {
window.sessionStorage.setItem(
HAS_RESOURCE_EVENTS_KEY,
JSON.stringify(value)
);
} catch {
// sessionStorage may be unavailable; predicate treats missing as unknown.
}
return value;
} catch (error) {
console.error('probeHasResourceEvents error', error);
try {
window.sessionStorage.removeItem(HAS_RESOURCE_EVENTS_KEY);
} catch {
// ignore
}
return undefined;
}
};
// runtime configuration // runtime configuration
export async function getInitialState(): Promise<{ export async function getInitialState(): Promise<{
fetchUserInfo: () => Promise<Global.UserInfo>; fetchUserInfo: () => Promise<Global.UserInfo>;
currentUser?: Global.UserInfo; currentUser?: Global.UserInfo;
pluginData?: Record<string, any>;
hasKubernetesCluster?: boolean;
hasResourceEvents?: boolean;
}> { }> {
const { location } = history; const { location } = history;
const fetchUserInfo = async (): Promise<Global.UserInfo> => { // In open-source builds the promise resolves immediately.
await enterprisePluginReady;
// initialize plugins and merge enterprise locales
let pluginData = {};
try {
pluginData = await GPUStackPluginManager.initialize({
request: umiRequest,
setUserSettings: (value) => setAtomStorage(userSettingsHelperAtom, value),
setStorageUserSettings: (value) =>
setAtomStorage(userSettingsHelperAtom, value),
defaultColorPrimary: COLOR_PRIMARY
});
} catch (error) {
console.error('Failed to initialize plugins:', error);
}
const getUpdateCheck = async () => {
try {
const data = await updateCheck();
setAtomStorage(UpdateCheckAtom, {
...data
});
return data;
} catch (error) {
console.error('updateCheck error', error);
}
};
const fetchUserInfo = async (config?: {
skipErrorHandler?: boolean;
}): Promise<Global.UserInfo> => {
try { try {
const data = await queryCurrentUserState({ const data = await queryCurrentUserState({
skipErrorHandler: true skipErrorHandler: true
}); });
if (data.is_admin) {
getUpdateCheck();
fetchSystemConfig();
}
// Only commit a substantive user object. A truthy-but-empty
// `data` (e.g. server responded 200 with an empty body) would
// otherwise look like "logged in" to every `currentUser`
// reader and the access seam — break out instead and let the
// caller treat the request as failed.
if (data && typeof data === 'object' && Object.keys(data).length > 0) {
// Commit the identity to atom storage (and so to localStorage)
// before returning. The access function — memoized on
// `initialState` and run once per commit — reads identity from
// localStorage; without this preemptive write the predicate
// sees the prior session's identity on its first evaluation
// after login, and stays stale until the next identity change
// (which usually doesn't come without a manual refresh).
try {
setAtomStorage(userAtom, data);
} catch (err) {
console.error('userAtom commit error:', err);
}
// Fire `onUserFetched` so plugins maintaining identity-scoped
// caches can seed them under the new identity before any
// caller commits this user to `initialState`. Errors here are
// swallowed and logged — fetchUserInfo must still return.
try {
await getGPUStackPlugin()?.login?.onUserFetched?.(data, {
request: umiRequest
});
} catch (err) {
console.error('onUserFetched plugin hook error:', err);
}
}
return data; return data;
} catch (error) { } catch (error: any) {
history.push(loginPath); const data = error?.response?.data;
if (data?.code === 401 && data?.message.includes('deactivate')) {
message.error({
content: (
<div>
<span>{data?.message}</span>
</div>
),
duration: 5
});
}
history.push(DEFAULT_ENTER_PAGE.login);
} }
return {} as Global.UserInfo; return {} as Global.UserInfo;
}; };
@@ -31,7 +217,16 @@ export async function getInitialState(): Promise<{
const getAppVersionInfo = async () => { const getAppVersionInfo = async () => {
try { try {
const data = await queryVersionInfo(); const data = await queryVersionInfo();
setAtomStorage(GPUStackVersionAtom, data);
const isDev = data.version?.indexOf('0.0.0') > -1;
const isRc = data.version?.indexOf('rc') > -1;
setAtomStorage(GPUStackVersionAtom, {
...data,
isProd: !isDev && !isRc,
isDev,
isRc
});
} catch (error) { } catch (error) {
console.error('queryVersionInfo error', error); console.error('queryVersionInfo error', error);
} }
@@ -39,20 +234,29 @@ export async function getInitialState(): Promise<{
getAppVersionInfo(); getAppVersionInfo();
if (![loginPath].includes(location.pathname)) { if (![DEFAULT_ENTER_PAGE.login].includes(location.pathname)) {
const userInfo = await fetchUserInfo(); const [userInfo, hasKubernetesCluster, hasResourceEvents] =
await Promise.all([
fetchUserInfo(),
probeHasKubernetesCluster(),
probeHasResourceEvents()
]);
checkDefaultPage(userInfo);
return { return {
fetchUserInfo, fetchUserInfo,
currentUser: userInfo currentUser: userInfo,
pluginData,
hasKubernetesCluster,
hasResourceEvents
}; };
} }
return { return {
fetchUserInfo fetchUserInfo,
pluginData
}; };
} }
export const request: RequestConfig = { export const request: RequestConfig = {
baseURL: ' /v1', baseURL: `/${GPUSTACK_API_BASE_URL}`,
...requestConfig ...requestConfig
}; };
Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1755020187776" class="icon" viewBox="0 0 1105 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7392" xmlns:xlink="http://www.w3.org/1999/xlink" width="138.125" height="128"><path d="M507.2896 133.44768l130.98496-71.4496v820.9408l-130.97984 69.71392V133.44768z" fill="#F38019" p-id="7393"></path><path d="M479.39072 323.968a724.30592 724.30592 0 0 0-77.056 16.6144C118.35904 417.01376 37.77536 603.8016 67.95776 701.696c30.11584 97.8944 161.03424 263.2192 439.2704 250.19904 0.13824-27.41248 0.13824-57.73824 0-90.89536-200.49408-26.37824-302.67904-88.82688-306.55488-187.40736-5.74464-147.74272 134.1696-216.90368 217.87136-229.0176 16.82432-2.49344 37.66272-5.67808 61.19936-8.6528l-0.27648-111.9488h-0.07168z m185.12384 107.65312c52.1984 5.6832 103.57248 18.69312 147.0464 44.44672-10.65984 5.19168-34.26816 19.73248-70.82496 43.47904l290.49344 66.39104-16.54272-206.58176-78.37184 44.30336c-116.10112-57.8048-205.19936-91.0336-267.29984-99.6864l-4.50048 107.648z" fill="#ADAFB3" p-id="7394"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1f1f1f"><path d="M140-180v-88.92q0-29.39 15.96-54.43 15.96-25.03 42.66-38.49 59.3-29.08 119.65-43.62Q378.62-420 440-420q21.06 0 42.12 1.89 21.05 1.88 42.11 5.65-1.69 51.46 20.81 96.81Q567.54-270.31 609-240v60H140ZM753.85-72.31l-53.35-53.14v-164.73q-39.11-11.51-63.85-43.97-24.73-32.46-24.73-74.7 0-51.46 36.38-87.84t87.85-36.38q51.46 0 87.66 36.39Q860-460.28 860-408.79q0 39.94-22.42 70.71-22.43 30.77-57.2 44.23l44.23 44.23-53.07 53.2 53.07 53.19-70.76 70.92ZM440-484.62q-57.75 0-98.87-41.12Q300-566.86 300-624.61q0-57.75 41.13-98.88 41.12-41.12 98.87-41.12 57.75 0 98.87 41.12Q580-682.36 580-624.61q0 57.75-41.13 98.87-41.12 41.12-98.87 41.12Zm296.15 93.47q14.7 0 25.04-10.54 10.35-10.54 10.35-25.23 0-14.69-10.35-25.04-10.34-10.35-25.04-10.35-14.69 0-25.23 10.35-10.54 10.35-10.54 25.04t10.54 25.23q10.54 10.54 25.23 10.54Z"/></svg>

After

Width:  |  Height:  |  Size: 934 B

+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none">
<g fill="#C22E33">
<path d="M7.754 2l.463.41c.343.304.687.607 1.026.915C11.44 5.32 13.3 7.565 14.7 10.149c.072.132.137.268.202.403l.098.203-.108.057-.081-.115-.21-.299-.147-.214c-1.019-1.479-2.04-2.96-3.442-4.145a6.563 6.563 0 00-1.393-.904c-1.014-.485-1.916-.291-2.69.505-.736.757-1.118 1.697-1.463 2.653-.045.123-.092.245-.139.367l-.082.215-.172-.055c.1-.348.192-.698.284-1.049.21-.795.42-1.59.712-2.356.31-.816.702-1.603 1.093-2.39.169-.341.338-.682.5-1.025h.092z"/>
<path d="M8.448 11.822c-1.626.77-5.56 1.564-7.426 1.36C.717 11.576 3.71 4.05 5.18 2.91l-.095.218a4.638 4.638 0 01-.138.303l-.066.129c-.76 1.462-1.519 2.926-1.908 4.53a7.482 7.482 0 00-.228 1.689c-.01 1.34.824 2.252 2.217 2.309.67.027 1.347-.043 2.023-.114.294-.03.587-.061.88-.084.108-.008.214-.021.352-.039l.231-.028z"/>
<path d="M3.825 14.781c-.445.034-.89.068-1.333.108 4.097.39 8.03-.277 11.91-1.644-1.265-2.23-2.97-3.991-4.952-5.522.026.098.084.169.141.239l.048.06c.17.226.348.448.527.67.409.509.818 1.018 1.126 1.578.778 1.42.356 2.648-1.168 3.296-1.002.427-2.097.718-3.18.892-1.03.164-2.075.243-3.119.323z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 286 64"><g><g><defs><path id="SVGID_1_" d="M47.5 17.6L25 4.8v52.6l9-5.2V37.4l6.8 3.9-.1-10.1-6.7-3.9v-5.9l13.5 7.9z"/></defs><clipPath id="SVGID_2_"><use xlink:href="#SVGID_1_" overflow="visible"/></clipPath><g clip-path="url(#SVGID_2_)"><linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-1.6" y1="335.05" x2="53.6" y2="335.05" gradientTransform="translate(0 -304)"><stop offset="0" stop-color="#ff6f00"/><stop offset="1" stop-color="#ffa800"/></linearGradient><path d="M-1.6 4.6h55.2v52.9H-1.6V4.6z" fill="url(#SVGID_3_)"/></g></g></g><g><g><defs><path id="SVGID_4_" d="M.5 17.6L23 4.8v52.6l-9-5.2V21.4L.5 29.3z"/></defs><clipPath id="SVGID_5_"><use xlink:href="#SVGID_4_" overflow="visible"/></clipPath><g clip-path="url(#SVGID_5_)"><linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-1.9" y1="335.05" x2="53.3" y2="335.05" gradientTransform="translate(0 -304)"><stop offset="0" stop-color="#ff6f00"/><stop offset="1" stop-color="#ffa800"/></linearGradient><path d="M-1.9 4.6h55.2v52.9H-1.9V4.6z" fill="url(#SVGID_6_)"/></g></g></g><path style="fill:#425066" d="M88.2 21.1h-10v27.7h-5.6V21.1h-10v-4.5h25.6v4.5z"/><path style="fill:#425066" d="M94.9 49.2c-3.4 0-6.2-1.1-8.3-3.2-2.1-2.1-3.2-5-3.2-8.6v-.7c0-2.2.4-4.4 1.4-6.4.9-1.8 2.2-3.3 3.9-4.4 1.7-1.1 3.6-1.6 5.6-1.6 3.3 0 5.8 1 7.6 3.1s2.7 5 2.7 8.8v2.2H88.9c.1 1.8.8 3.4 2 4.7 1.2 1.2 2.7 1.8 4.4 1.7 2.4.1 4.6-1.1 6-3l2.9 2.8c-1 1.4-2.3 2.6-3.8 3.3-1.8 1-3.6 1.4-5.5 1.3zm-.6-20.5c-1.4-.1-2.7.5-3.6 1.5-1 1.2-1.6 2.7-1.7 4.3h10.3v-.4c-.1-1.8-.6-3.2-1.4-4.1-1-.8-2.3-1.4-3.6-1.3zm19.4-3.9l.2 2.8c1.7-2.1 4.3-3.3 7-3.2 5 0 7.5 2.9 7.6 8.6v15.8h-5.4V33.3c0-1.5-.3-2.6-1-3.4-.7-.7-1.7-1.1-3.2-1.1-2.1-.1-4 1.1-4.9 2.9v17h-5.4v-24l5.1.1zm32.2 17.5c0-.9-.4-1.7-1.2-2.2-1.2-.7-2.6-1.1-3.9-1.3-1.6-.3-3.1-.8-4.6-1.5-2.7-1.3-4-3.2-4-5.6 0-2 1-4 2.6-5.2 1.7-1.4 4-2.1 6.6-2.1 2.9 0 5.2.7 6.9 2.1 1.7 1.3 2.7 3.4 2.6 5.5h-5.4c0-1-.4-1.9-1.2-2.6-.9-.7-1.9-1.1-3.1-1-1 0-2 .2-2.9.8-.7.5-1.1 1.3-1.1 2.2 0 .8.4 1.5 1 1.9.7.5 2.1.9 4.2 1.4 1.7.3 3.4.9 5 1.7 1.1.5 2 1.3 2.7 2.3.6 1 .9 2.1.9 3.3 0 2.1-1 4-2.7 5.2-1.8 1.3-4.1 2-7 2-1.8 0-3.6-.3-5.2-1.1-1.4-.6-2.7-1.6-3.6-2.9-.8-1.2-1.3-2.6-1.3-4h5.2c0 1.1.5 2.2 1.4 2.9 1 .7 2.3 1.1 3.5 1 1.4 0 2.5-.3 3.2-.8 1-.4 1.4-1.2 1.4-2zm8.1-5.7c0-2.2.4-4.4 1.4-6.3.9-1.8 2.2-3.3 3.9-4.3 1.8-1 3.8-1.6 5.8-1.5 3.2 0 5.9 1 7.9 3.1s3.1 4.8 3.3 8.3v1.3c0 2.2-.4 4.3-1.4 6.3-.8 1.8-2.2 3.3-3.9 4.3-1.8 1-3.8 1.6-5.9 1.5-3.4 0-6.1-1.1-8.1-3.4-2-2.2-3-5.2-3.1-9l.1-.3zm5.3.5c0 2.5.5 4.4 1.5 5.8 1.8 2.3 5.1 2.8 7.5 1 .4-.3.7-.6 1-1 1-1.4 1.5-3.5 1.5-6.2 0-2.4-.5-4.3-1.6-5.8-1.7-2.3-5-2.8-7.4-1.1-.4.3-.8.7-1.1 1-.8 1.4-1.4 3.5-1.4 6.3zm33.1-7.3c-.7-.1-1.5-.2-2.2-.2-2.5 0-4.1.9-5 2.8v16.4h-5.4v-24h5.1l.1 2.7c1.3-2.1 3.1-3.1 5.4-3.1.6 0 1.3.1 1.9.3l.1 5.1zm22.5 5.3h-13v13.7h-5.6V16.6h20.5v4.5h-14.9v9.6h13v4.4zm10.7 13.7h-5.4V16.5h5.4v32.3zm3.9-12.2c0-2.2.4-4.4 1.4-6.3.9-1.8 2.2-3.3 3.9-4.3 1.8-1 3.8-1.6 5.8-1.5 3.2 0 5.9 1 7.9 3.1s3.1 4.8 3.3 8.3v1.3c0 2.2-.4 4.3-1.3 6.3-.8 1.8-2.2 3.3-3.9 4.3-1.8 1-3.8 1.6-5.9 1.5-3.4 0-6.1-1.1-8.1-3.4-2-2.2-3.1-5.2-3.1-9v-.3zm5.4.5c0 2.5.5 4.4 1.5 5.8 1 1.4 2.6 2.2 4.3 2.1 1.7.1 3.3-.7 4.2-2.1 1-1.4 1.5-3.5 1.5-6.2 0-2.4-.5-4.3-1.6-5.8-1.7-2.3-5-2.8-7.4-1.1-.4.3-.8.7-1.1 1-.9 1.4-1.4 3.5-1.4 6.3zm41.2 4.3l3.8-16.5h5.2l-6.5 24h-4.4l-5.1-16.5-5.1 16.5h-4.4l-6.6-24h5.3l3.9 16.4 4.9-16.4h4.1l4.9 16.5z"/></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>AI360</title><path clip-rule="evenodd" d="M12 0h.018c1.473-.002 2.88.261 4.179.754C20.755 2.456 24 6.85 24 12c0 6.627-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0zm8.604 18.967A11.024 11.024 0 0023.07 12c0-1.717-.39-3.344-1.089-4.794a2.59 2.59 0 01-3.214.62 6.278 6.278 0 01-1.333-.992C16.283 5.73 15.109 4.66 13.696 3.9c-3.211-1.729-6.825-1.501-9.695.447A11.033 11.033 0 00.93 12c0 1.663.367 3.241 1.024 4.657.75-.973 2.131-1.346 3.232-.71.667.384 1.257.92 1.837 1.447l.176.16c1.365 1.234 2.794 2.355 4.558 2.965 3.053 1.053 6.356.437 8.847-1.552z" fill="url(#lobe-icons-ai-360-fill-0)" fill-rule="evenodd"></path><path d="M5.643 10.312c-.83.11-1.401.766-1.408 1.618a1.715 1.715 0 001.45 1.72c.805.128 1.64-.426 1.87-1.26.046-.167.076-.338.106-.51.025-.14.05-.282.084-.42.318-1.317 1.237-1.95 2.788-1.93 1.086.013 1.318.271 1.68 1.855.017.076.043.151.07.226.26.714.976 1.17 1.67 1.065a1.647 1.647 0 001.38-1.438c.083-.729-.348-1.264-1.122-1.575-.34-.136-.664-.158-.995-.141-.726.037-1.121-.36-1.339-.977a3.359 3.359 0 01-.134-.65c-.014-.093-.027-.186-.043-.278-.156-.887-.835-1.51-1.669-1.532-.791-.02-1.464.551-1.665 1.418l-.06.27-.025.117c-.355 1.636-.974 2.205-2.638 2.422z" fill="url(#lobe-icons-ai-360-fill-1)"></path><path d="M18.059 13.644c.989-.206 1.577-.838 1.592-1.697.015-.83-.624-1.582-1.46-1.724-.77-.13-1.599.383-1.844 1.18-.069.22-.117.448-.165.676-.06.29-.122.58-.225.854-.367.986-1.593 1.546-2.926 1.394-.824-.095-1.106-.446-1.342-1.674-.18-.938-.864-1.535-1.681-1.467-.85.07-1.515.829-1.468 1.673.05.892.678 1.44 1.705 1.489 1.375.064 1.75.396 1.926 1.787.067.531.267.967.685 1.288 1.02.783 2.407.208 2.66-1.108l.022-.114c.152-.796.3-1.577 1.04-2.101.36-.255.761-.326 1.166-.397.105-.019.21-.037.315-.06z" fill="url(#lobe-icons-ai-360-fill-2)"></path><path d="M13.83 7.961a.755.755 0 11-1.51 0 .755.755 0 011.51 0z" fill="url(#lobe-icons-ai-360-fill-3)"></path><path d="M10.809 16.678a.755.755 0 100-1.511.755.755 0 000 1.51z" fill="url(#lobe-icons-ai-360-fill-4)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-0" x1="12" x2="12" y1="0" y2="24"><stop stop-color="#12B7FA"></stop><stop offset="1" stop-color="#006ffb"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-1" x1="11.943" x2="11.943" y1="6.085" y2="17.778"><stop stop-color="#006ffb"></stop><stop offset="1" stop-color="#12B7FA"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-2" x1="11.943" x2="11.943" y1="6.085" y2="17.778"><stop stop-color="#006ffb"></stop><stop offset="1" stop-color="#12B7FA"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-3" x1="11.943" x2="11.943" y1="6.085" y2="17.778"><stop stop-color="#006ffb"></stop><stop offset="1" stop-color="#12B7FA"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-ai-360-fill-4" x1="11.943" x2="11.943" y1="6.085" y2="17.778"><stop stop-color="#006ffb"></stop><stop offset="1" stop-color="#12B7FA"></stop></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>AlibabaCloud</title><path d="M14.752 4.64h5.274C22.242 4.64 24 6.475 24 8.691V15.8a3.947 3.947 0 01-3.974 3.975h-5.274l1.299-1.835 3.822-1.222c.688-.23 1.146-.918 1.146-1.605v-5.81c0-.687-.458-1.375-1.146-1.605L16.05 6.475l-1.3-1.835zM2.98 15.111c0 .688.46 1.376 1.147 1.606l3.822 1.146 1.3 1.835H3.974A3.947 3.947 0 010 15.723V8.69c0-2.216 1.758-4.05 3.975-4.05h5.273L7.95 6.474 4.127 7.697c-.688.23-1.146.918-1.146 1.606v5.808z" fill="#FF6A00"></path><path d="M16.051 11.213H8.025v1.835h8.026v-1.835z" fill="#FF6A00"></path></svg>

After

Width:  |  Height:  |  Size: 656 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>AzureAI</title><path clip-rule="evenodd" d="M16.233 0c.713 0 1.345.551 1.572 1.329.227.778 1.555 5.59 1.555 5.59v9.562h-4.813L14.645 0h1.588z" fill="url(#lobe-icons-azure-ai-fill-0)" fill-rule="evenodd"></path><path d="M23.298 7.47c0-.34-.275-.6-.6-.6h-2.835a3.617 3.617 0 00-3.614 3.615v5.996h3.436a3.617 3.617 0 003.613-3.614V7.47z" fill="url(#lobe-icons-azure-ai-fill-1)"></path><path clip-rule="evenodd" d="M16.233 0a.982.982 0 00-.989.989l-.097 18.198A4.814 4.814 0 0110.334 24H1.6a.597.597 0 01-.567-.794l7-19.981A4.819 4.819 0 0112.57 0h3.679-.016z" fill="url(#lobe-icons-azure-ai-fill-2)" fill-rule="evenodd"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-azure-ai-fill-0" x1="18.242" x2="14.191" y1="16.837" y2=".616"><stop stop-color="#712575"></stop><stop offset=".09" stop-color="#9A2884"></stop><stop offset=".18" stop-color="#BF2C92"></stop><stop offset=".27" stop-color="#DA2E9C"></stop><stop offset=".34" stop-color="#EB30A2"></stop><stop offset=".4" stop-color="#F131A5"></stop><stop offset=".5" stop-color="#EC30A3"></stop><stop offset=".61" stop-color="#DF2F9E"></stop><stop offset=".72" stop-color="#C92D96"></stop><stop offset=".83" stop-color="#AA2A8A"></stop><stop offset=".95" stop-color="#83267C"></stop><stop offset="1" stop-color="#712575"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-azure-ai-fill-1" x1="19.782" x2="19.782" y1=".34" y2="23.222"><stop stop-color="#DA7ED0"></stop><stop offset=".08" stop-color="#B17BD5"></stop><stop offset=".19" stop-color="#8778DB"></stop><stop offset=".3" stop-color="#6276E1"></stop><stop offset=".41" stop-color="#4574E5"></stop><stop offset=".54" stop-color="#2E72E8"></stop><stop offset=".67" stop-color="#1D71EB"></stop><stop offset=".81" stop-color="#1471EC"></stop><stop offset="1" stop-color="#1171ED"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-azure-ai-fill-2" x1="18.404" x2="3.236" y1=".859" y2="25.183"><stop stop-color="#DA7ED0"></stop><stop offset=".05" stop-color="#B77BD4"></stop><stop offset=".11" stop-color="#9079DA"></stop><stop offset=".18" stop-color="#6E77DF"></stop><stop offset=".25" stop-color="#5175E3"></stop><stop offset=".33" stop-color="#3973E7"></stop><stop offset=".42" stop-color="#2772E9"></stop><stop offset=".54" stop-color="#1A71EB"></stop><stop offset=".68" stop-color="#1371EC"></stop><stop offset="1" stop-color="#1171ED"></stop></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Baichuan</title><defs><linearGradient id="lobe-icons-baichuan-fill" x1="17.764%" x2="100%" y1="8.678%" y2="91.322%"><stop offset="0%" stop-color="#FEC13E"></stop><stop offset="100%" stop-color="#FF6933"></stop></linearGradient></defs><path d="M7.333 2h-3.2l-2 4.333V17.8L0 22h5.2l2.028-4.2L7.333 2zm7.334 0h-5.2v20h5.2V2zM16.8 7.733H22V22h-5.2V7.733zM22 2h-5.2v4.133H22V2z" fill="url(#lobe-icons-baichuan-fill)" fill-rule="nonzero"></path></svg>

After

Width:  |  Height:  |  Size: 569 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>BaiduCloud</title><path d="M21.715 5.61l-3.983 2.31a.903.903 0 01-.896 0L12.44 5.384a.903.903 0 00-.897 0L7.156 7.92a.903.903 0 01-.896 0L2.276 5.617 12.002 0l9.713 5.61z" fill="#5BCA87"></path><path d="M18.641 9.467a.89.89 0 00-.438.77v5.072a.896.896 0 01-.445.77l-4.428 2.51a.884.884 0 00-.445.777v4.607l4.429-2.536 5.31-3.047V7.157l-3.983 2.31z" fill="#EC5D3E"></path><path d="M10.98 18.941a.936.936 0 00-.305-.352l-4.429-2.516a.903.903 0 01-.431-.764v-5.078a.89.89 0 00-.452-.757l-.451-.26L1.38 7.158V18.39l5.311 3.047L11.126 24v-4.608a.881.881 0 00-.146-.45z" fill="#2464F5"></path></svg>

After

Width:  |  Height:  |  Size: 717 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>BaiLian</title><path d="M6.336 8.919v6.162l5.335-3.083L6.337 8.92z" fill="#1C54E3"></path><path d="M21.394 5.288s-.006-.006-.01-.006L17.01 2.754 6.336 8.92l5.335 3.082 9.701-5.6.016-.01a.635.635 0 00.006-1.1v-.003z" fill="#AA9AFF"></path><path d="M21.71 12.465a.62.62 0 00-.316.085s-.006 0-.009.003l-4.375 2.528 5.05 2.915h.006a2.06 2.06 0 00.28-1.04v-3.855a.637.637 0 00-.636-.636z" fill="#00EAD1"></path><path d="M22.06 17.996l-5.05-2.915L6.34 21.242l4.27 2.465s.016.006.022.012a2.102 2.102 0 002.093 0c.006-.003.016-.006.022-.012l8.538-4.93c.003 0 .006-.003.01-.006.321-.183.589-.45.775-.772h-.006l-.004-.003z" fill="#00CEC9"></path><path d="M11.672 11.998l-5.336 3.083-1.444.832-3.605 2.083H1.28c.173.303.416.555.709.738l.078.044.016.01.02.012 4.232 2.442 10.671-6.161-5.335-3.082z" fill="#00EAD1"></path><path d="M12.74.29c-.1-.06-.208-.107-.315-.148-.02-.006-.038-.016-.057-.022a2.121 2.121 0 00-.7-.12c-.233 0-.457.038-.668.11l-.031.01a2.196 2.196 0 00-.372.17L2.068 5.222s-.003 0-.006.003c-.324.183-.592.451-.781.773h.006l5.049 2.918L17.01 2.758 12.74.29z" fill="#7347FF"></path><path d="M1.287 6.001H1.28A2.06 2.06 0 001 7.041v9.915c0 .378.1.735.28 1.043h.007l5.049-2.918V8.919l-5.05-2.918z" fill="#0423DA"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Bedrock</title><defs><linearGradient id="lobe-icons-bedrock-fill" x1="80%" x2="20%" y1="20%" y2="80%"><stop offset="0%" stop-color="#6350FB"></stop><stop offset="50%" stop-color="#3D8FFF"></stop><stop offset="100%" stop-color="#9AD8F8"></stop></linearGradient></defs><path d="M13.05 15.513h3.08c.214 0 .389.177.389.394v1.82a1.704 1.704 0 011.296 1.661c0 .943-.755 1.708-1.685 1.708-.931 0-1.686-.765-1.686-1.708 0-.807.554-1.484 1.297-1.662v-1.425h-2.69v4.663a.395.395 0 01-.188.338l-2.69 1.641a.385.385 0 01-.405-.002l-4.926-3.086a.395.395 0 01-.185-.336V16.3L2.196 14.87A.395.395 0 012 14.555L2 14.528V9.406c0-.14.073-.27.192-.34l2.465-1.462V4.448c0-.129.062-.249.165-.322l.021-.014L9.77 1.058a.385.385 0 01.407 0l2.69 1.675a.395.395 0 01.185.336V7.6h3.856V5.683a1.704 1.704 0 01-1.296-1.662c0-.943.755-1.708 1.685-1.708.931 0 1.685.765 1.685 1.708 0 .807-.553 1.484-1.296 1.662v2.311a.391.391 0 01-.389.394h-4.245v1.806h6.624a1.69 1.69 0 011.64-1.313c.93 0 1.685.764 1.685 1.707 0 .943-.754 1.708-1.685 1.708a1.69 1.69 0 01-1.64-1.314H13.05v1.937h4.953l.915 1.18a1.66 1.66 0 01.84-.227c.931 0 1.685.764 1.685 1.707 0 .943-.754 1.708-1.685 1.708-.93 0-1.685-.765-1.685-1.708 0-.346.102-.668.276-.937l-.724-.935H13.05v1.806zM9.973 1.856L7.93 3.122V6.09h-.778V3.604L5.435 4.669v2.945l2.11 1.36L9.712 7.61V5.334h.778V7.83c0 .136-.07.263-.184.335L7.963 9.638v2.081l1.422 1.009-.446.646-1.406-.998-1.53 1.005-.423-.66 1.605-1.055v-1.99L5.038 8.29l-2.26 1.34v1.676l1.972-1.189.398.677-2.37 1.429V14.3l2.166 1.258 2.27-1.368.397.677-2.176 1.311V19.3l1.876 1.175 2.365-1.426.398.678-2.017 1.216 1.918 1.201 2.298-1.403v-5.78l-4.758 2.893-.4-.675 5.158-3.136V3.289L9.972 1.856zM16.13 18.47a.913.913 0 00-.908.92c0 .507.406.918.908.918a.913.913 0 00.907-.919.913.913 0 00-.907-.92zm3.63-3.81a.913.913 0 00-.908.92c0 .508.406.92.907.92a.913.913 0 00.908-.92.913.913 0 00-.908-.92zm1.555-4.99a.913.913 0 00-.908.92c0 .507.407.918.908.918a.913.913 0 00.907-.919.913.913 0 00-.907-.92zM17.296 3.1a.913.913 0 00-.907.92c0 .508.406.92.907.92a.913.913 0 00.908-.92.913.913 0 00-.908-.92z" fill="url(#lobe-icons-bedrock-fill)" fill-rule="nonzero"></path></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Claude</title><path d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z" fill="#D97757" fill-rule="nonzero"></path></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Cloudflare</title><path d="M16.493 17.4c.135-.52.08-.983-.161-1.338-.215-.328-.592-.519-1.05-.519l-8.663-.109a.148.148 0 01-.135-.082c-.027-.054-.027-.109-.027-.163.027-.082.108-.164.189-.164l8.744-.11c1.05-.054 2.153-.9 2.556-1.937l.511-1.31c.027-.055.027-.11.027-.164C17.92 8.91 15.66 7 12.942 7c-2.503 0-4.628 1.638-5.381 3.903a2.432 2.432 0 00-1.803-.491c-1.21.109-2.153 1.092-2.287 2.32-.027.328 0 .628.054.9C1.56 13.688 0 15.326 0 17.319c0 .19.027.355.027.545 0 .082.08.137.161.137h15.983c.08 0 .188-.055.215-.164l.107-.437" fill="#F38020"></path><path d="M19.238 11.75h-.242c-.054 0-.108.054-.135.109l-.35 1.2c-.134.52-.08.983.162 1.338.215.328.592.518 1.05.518l1.855.11c.054 0 .108.027.135.082.027.054.027.109.027.163-.027.082-.108.164-.188.164l-1.91.11c-1.05.054-2.153.9-2.557 1.937l-.134.355c-.027.055.026.137.107.137h6.592c.081 0 .162-.055.162-.137.107-.41.188-.846.188-1.31-.027-2.62-2.153-4.777-4.762-4.777" fill="#FCAD32"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Cohere</title><path clip-rule="evenodd" d="M8.128 14.099c.592 0 1.77-.033 3.398-.703 1.897-.781 5.672-2.2 8.395-3.656 1.905-1.018 2.74-2.366 2.74-4.18A4.56 4.56 0 0018.1 1H7.549A6.55 6.55 0 001 7.55c0 3.617 2.745 6.549 7.128 6.549z" fill="#39594D" fill-rule="evenodd"></path><path clip-rule="evenodd" d="M9.912 18.61a4.387 4.387 0 012.705-4.052l3.323-1.38c3.361-1.394 7.06 1.076 7.06 4.715a5.104 5.104 0 01-5.105 5.104l-3.597-.001a4.386 4.386 0 01-4.386-4.387z" fill="#D18EE2" fill-rule="evenodd"></path><path d="M4.776 14.962A3.775 3.775 0 001 18.738v.489a3.776 3.776 0 007.551 0v-.49a3.775 3.775 0 00-3.775-3.775z" fill="#FF7759"></path></svg>

After

Width:  |  Height:  |  Size: 769 B

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Coze</title><path clip-rule="evenodd" d="M3.908 9.096A8.092 8.092 0 0111.998 1h.006c4.468 0 8.09 3.628 8.09 8.096v3.392h1.942c2.23 0 2.732 3.126.615 3.828l-2.556.85v1.466a1.947 1.947 0 01-2.818 1.742l-1.42-.707c-.067-.03-.149 0-.17.071-1.147 3.587-6.225 3.587-7.373 0a.123.123 0 00-.169-.07l-1.42.706c-1.29.65-2.817-.292-2.817-1.742v-1.466l-2.557-.85c-2.122-.697-1.614-3.828.615-3.828h1.942V9.096zm4.571 2.613a.784.784 0 00-.784.784v1.568a.784.784 0 101.568 0v-1.568a.784.784 0 00-.784-.784zm7.045.779a.784.784 0 100 1.568.784.784 0 000-1.568zm-6.186 3.415a.78.78 0 00.17.254 3.517 3.517 0 004.98 0 .782.782 0 10-1.106-1.107 1.958 1.958 0 01-2.767 0 .78.78 0 00-1.277.254.78.78 0 000 .6z"></path></svg>

After

Width:  |  Height:  |  Size: 866 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>DeepL</title><path d="M11.563 0c.24 0 .475.065.682.187l8.197 4.756a1.383 1.383 0 01.683 1.197v9.528c0 .495-.26.949-.683 1.196l-4.79 2.78.01-.002-.155.087-.23.133a.69.69 0 00-.3.563v.386l-.16-.683-2.572 1.493a1.35 1.35 0 01-1.366 0l-8.195-4.757A1.384 1.384 0 012 15.668V6.14c0-.482.26-.936.684-1.183l8.195-4.77c.207-.122.443-.187.684-.187zm-1.27 14.023a1.405 1.405 0 00-2.038-.073 1.43 1.43 0 00.984 2.464c.368 0 .722-.144.985-.401a1.428 1.428 0 00.396-1.384l3.674-2.137-.683-.386-3.317 1.917zM9.24 6.164c-.368 0-.72.145-.983.402a1.43 1.43 0 00-.326 1.592c.075.177.187.338.326.47a1.405 1.405 0 002.021-.055l3.745 2.173.013-.009a1.427 1.427 0 00.368 1.48 1.403 1.403 0 001.967 0 1.428 1.428 0 000-2.063 1.403 1.403 0 00-1.986.02l-3.77-2.201a1.427 1.427 0 00-.39-1.407 1.405 1.405 0 00-.985-.402z" fill="#0F2B46"></path><path clip-rule="evenodd" d="M14.978 24v-3.959l-4.781 1.182" fill="#0F2B46" fill-rule="evenodd"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>DeepSeek</title><path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z" fill="#4D6BFE"></path></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Dify</title><path d="M7.043 6.487c1.635 0 2.241-1.003 2.241-2.243S8.681 2 7.044 2C5.405 2 4.801 3.003 4.801 4.244c0 1.24.604 2.243 2.241 2.243z" fill="#03F"></path><path d="M14.883 6.97v1.443h-3.679v3.203h3.68v8.012H8.801V8.41h-8v3.203h4.48v8.012H0v3.203h24v-3.203h-5.6v-8.012H24V8.41h-5.6V5.206H24V2.003h-4.161a4.97 4.97 0 00-4.961 4.967h.005z" fill="#03F"></path></svg>

After

Width:  |  Height:  |  Size: 495 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Doubao</title><path d="M5.31 15.756c.172-3.75 1.883-5.999 2.549-6.739-3.26 2.058-5.425 5.658-6.358 8.308v1.12C1.501 21.513 4.226 24 7.59 24a6.59 6.59 0 002.2-.375c.353-.12.7-.248 1.039-.378.913-.899 1.65-1.91 2.243-2.992-4.877 2.431-7.974.072-7.763-4.5l.002.001z" fill="#1E37FC"></path><path d="M22.57 10.283c-1.212-.901-4.109-2.404-7.397-2.8.295 3.792.093 8.766-2.1 12.773a12.782 12.782 0 01-2.244 2.992c3.764-1.448 6.746-3.457 8.596-5.219 2.82-2.683 3.353-5.178 3.361-6.66a2.737 2.737 0 00-.216-1.084v-.002z" fill="#37E1BE"></path><path d="M14.303 1.867C12.955.7 11.248 0 9.39 0 7.532 0 5.883.677 4.545 1.807 2.791 3.29 1.627 5.557 1.5 8.125v9.201c.932-2.65 3.097-6.25 6.357-8.307.5-.318 1.025-.595 1.569-.829 1.883-.801 3.878-.932 5.746-.706-.222-2.83-.718-5.002-.87-5.617h.001z" fill="#A569FF"></path><path d="M17.305 4.961a199.47 199.47 0 01-1.08-1.094c-.202-.213-.398-.419-.586-.622l-1.333-1.378c.151.615.648 2.786.869 5.617 3.288.395 6.185 1.898 7.396 2.8-1.306-1.275-3.475-3.487-5.266-5.323z" fill="#1E37FC"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Fireworks</title><path clip-rule="evenodd" d="M14.8 5l-2.801 6.795L9.195 5H7.397l3.072 7.428a1.64 1.64 0 003.038.002L16.598 5H14.8zm1.196 10.352l5.124-5.244-.699-1.669-5.596 5.739a1.664 1.664 0 00-.343 1.807 1.642 1.642 0 001.516 1.012L16 17l8-.02-.699-1.669-7.303.041h-.002zM2.88 10.104l.699-1.669 5.596 5.739c.468.479.603 1.189.343 1.807a1.643 1.643 0 01-1.516 1.012l-8-.018-.002.002.699-1.669 7.303.042-5.122-5.246z" fill="#5019C5" fill-rule="evenodd"></path></svg>

After

Width:  |  Height:  |  Size: 592 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Gemini</title><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="#3186FF"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-0)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-1)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-2)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-0" x1="7" x2="11" y1="15.5" y2="12"><stop stop-color="#08B962"></stop><stop offset="1" stop-color="#08B962" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-1" x1="8" x2="11.5" y1="5.5" y2="11"><stop stop-color="#F94543"></stop><stop offset="1" stop-color="#F94543" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-2" x1="3.5" x2="17.5" y1="13.5" y2="12"><stop stop-color="#FABC12"></stop><stop offset=".46" stop-color="#FABC12" stop-opacity="0"></stop></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Github</title><path d="M12 0c6.63 0 12 5.276 12 11.79-.001 5.067-3.29 9.567-8.175 11.187-.6.118-.825-.25-.825-.56 0-.398.015-1.665.015-3.242 0-1.105-.375-1.813-.81-2.181 2.67-.295 5.475-1.297 5.475-5.822 0-1.297-.465-2.344-1.23-3.169.12-.295.54-1.503-.12-3.125 0 0-1.005-.324-3.3 1.209a11.32 11.32 0 00-3-.398c-1.02 0-2.04.133-3 .398-2.295-1.518-3.3-1.209-3.3-1.209-.66 1.622-.24 2.83-.12 3.125-.765.825-1.23 1.887-1.23 3.169 0 4.51 2.79 5.527 5.46 5.822-.345.294-.66.81-.765 1.577-.69.31-2.415.81-3.495-.973-.225-.354-.9-1.223-1.845-1.209-1.005.015-.405.56.015.781.51.28 1.095 1.327 1.23 1.666.24.663 1.02 1.93 4.035 1.385 0 .988.015 1.916.015 2.196 0 .31-.225.664-.825.56C3.303 21.374-.003 16.867 0 11.791 0 5.276 5.37 0 12 0z"></path></svg>

After

Width:  |  Height:  |  Size: 907 B

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Grok</title><path d="M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815"></path></svg>

After

Width:  |  Height:  |  Size: 756 B

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Groq</title><path d="M12.036 2c-3.853-.035-7 3-7.036 6.781-.035 3.782 3.055 6.872 6.908 6.907h2.42v-2.566h-2.292c-2.407.028-4.38-1.866-4.408-4.23-.029-2.362 1.901-4.298 4.308-4.326h.1c2.407 0 4.358 1.915 4.365 4.278v6.305c0 2.342-1.944 4.25-4.323 4.279a4.375 4.375 0 01-3.033-1.252l-1.851 1.818A7 7 0 0012.029 22h.092c3.803-.056 6.858-3.083 6.879-6.816v-6.5C18.907 4.963 15.817 2 12.036 2z"></path></svg>

After

Width:  |  Height:  |  Size: 568 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Hunyuan</title><circle cx="12" cy="12" fill="#0055E9" r="12"></circle><path d="M12 0c.518 0 1.028.033 1.528.096A6.188 6.188 0 0112.12 12.28l-.12.001c-2.99 0-5.242 2.179-5.554 5.11-.223 2.086.353 4.412 2.242 6.146C3.672 22.1 0 17.479 0 12 0 5.373 5.373 0 12 0z" fill="#A8DFF5"></path><path d="M5.286 5a2.438 2.438 0 01.682 3.38c-3.962 5.966-3.215 10.743 2.648 15.136C3.636 22.056 0 17.452 0 12c0-1.787.39-3.482 1.09-5.006.253-.435.525-.872.817-1.311A2.438 2.438 0 015.286 5z" fill="#0055E9"></path><path d="M12.98.04c.272.021.543.053.81.093.583.106 1.117.254 1.538.44 6.638 2.927 8.07 10.052 1.748 15.642a4.125 4.125 0 01-5.822-.358c-1.51-1.706-1.3-4.184.357-5.822.858-.848 3.108-1.223 4.045-2.441 1.257-1.634 2.122-6.009-2.523-7.506L12.98.039z" fill="#00BCFF"></path><path d="M13.528.096A6.187 6.187 0 0112 12.281a5.75 5.75 0 00-1.71.255c.147-.905.595-1.784 1.321-2.501.858-.848 3.108-1.223 4.045-2.441 1.27-1.651 2.14-6.104-2.676-7.554.184.014.367.033.548.056z" fill="#ECECEE"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>LongCat</title><path clip-rule="evenodd" d="M.507 19.883a.507.507 0 01-.489-.642L4.29 3.745a1.013 1.013 0 011.533-.578l5.622 3.687a1.013 1.013 0 001.11 0L18.2 3.165a1.013 1.013 0 011.532.58l4.25 15.497a.506.506 0 01-.49.64H18.07a6.297 6.297 0 001.53-4.115v-.177a6.09 6.09 0 00-1.513-4.017l-.697-3.495a.438.438 0 00-.694-.266L14.07 9.781a.748.748 0 01-.654.121 5.156 5.156 0 00-2.833 0 .746.746 0 01-.653-.121L7.302 7.81a.435.435 0 00-.688.269l-.675 3.652a5.36 5.36 0 00-1.539 3.76v.333c0 1.474.527 2.9 1.488 4.02l.032.038H.507z" fill="#29E154" fill-rule="evenodd"></path><path d="M9.213 16.843h1.52v-3.546h-1.29l-.23 3.546zm5.573 0h-1.52v-3.546h1.29l.23 3.546z"></path></svg>

After

Width:  |  Height:  |  Size: 819 B

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Minimax</title><defs><linearGradient id="lobe-icons-minimax-fill" x1="0%" x2="100.182%" y1="50.057%" y2="50.057%"><stop offset="0%" stop-color="#E2167E"></stop><stop offset="100%" stop-color="#FE603C"></stop></linearGradient></defs><path d="M16.278 2c1.156 0 2.093.927 2.093 2.07v12.501a.74.74 0 00.744.709.74.74 0 00.743-.709V9.099a2.06 2.06 0 012.071-2.049A2.06 2.06 0 0124 9.1v6.561a.649.649 0 01-.652.645.649.649 0 01-.653-.645V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v7.472a2.037 2.037 0 01-2.048 2.026 2.037 2.037 0 01-2.048-2.026v-12.5a.785.785 0 00-.788-.753.785.785 0 00-.789.752l-.001 15.904A2.037 2.037 0 0113.441 22a2.037 2.037 0 01-2.048-2.026V18.04c0-.356.292-.645.652-.645.36 0 .652.289.652.645v1.934c0 .263.142.506.372.638.23.131.514.131.744 0a.734.734 0 00.372-.638V4.07c0-1.143.937-2.07 2.093-2.07zm-5.674 0c1.156 0 2.093.927 2.093 2.07v11.523a.648.648 0 01-.652.645.648.648 0 01-.652-.645V4.07a.785.785 0 00-.789-.78.785.785 0 00-.789.78v14.013a2.06 2.06 0 01-2.07 2.048 2.06 2.06 0 01-2.071-2.048V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v3.8a2.06 2.06 0 01-2.071 2.049A2.06 2.06 0 010 12.9v-1.378c0-.357.292-.646.652-.646.36 0 .653.29.653.646V12.9c0 .418.343.757.766.757s.766-.339.766-.757V9.099a2.06 2.06 0 012.07-2.048 2.06 2.06 0 012.071 2.048v8.984c0 .419.343.758.767.758.423 0 .766-.339.766-.758V4.07c0-1.143.937-2.07 2.093-2.07z" fill="url(#lobe-icons-minimax-fill)" fill-rule="nonzero"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Mistral</title><path d="M3.428 3.4h3.429v3.428H3.428V3.4zm13.714 0h3.43v3.428h-3.43V3.4z" fill="gold"></path><path d="M3.428 6.828h6.857v3.429H3.429V6.828zm10.286 0h6.857v3.429h-6.857V6.828z" fill="#FFAF00"></path><path d="M3.428 10.258h17.144v3.428H3.428v-3.428z" fill="#FF8205"></path><path d="M3.428 13.686h3.429v3.428H3.428v-3.428zm6.858 0h3.429v3.428h-3.429v-3.428zm6.856 0h3.43v3.428h-3.43v-3.428z" fill="#FA500F"></path><path d="M0 17.114h10.286v3.429H0v-3.429zm13.714 0H24v3.429H13.714v-3.429z" fill="#E10500"></path></svg>

After

Width:  |  Height:  |  Size: 655 B

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>MoonshotAI</title><path d="M1.052 16.916l9.539 2.552a21.007 21.007 0 00.06 2.033l5.956 1.593a11.997 11.997 0 01-5.586.865l-.18-.016-.044-.004-.084-.009-.094-.01a11.605 11.605 0 01-.157-.02l-.107-.014-.11-.016a11.962 11.962 0 01-.32-.051l-.042-.008-.075-.013-.107-.02-.07-.015-.093-.019-.075-.016-.095-.02-.097-.023-.094-.022-.068-.017-.088-.022-.09-.024-.095-.025-.082-.023-.109-.03-.062-.02-.084-.025-.093-.028-.105-.034-.058-.019-.08-.026-.09-.031-.066-.024a6.293 6.293 0 01-.044-.015l-.068-.025-.101-.037-.057-.022-.08-.03-.087-.035-.088-.035-.079-.032-.095-.04-.063-.028-.063-.027a5.655 5.655 0 01-.041-.018l-.066-.03-.103-.047-.052-.024-.096-.046-.062-.03-.084-.04-.086-.044-.093-.047-.052-.027-.103-.055-.057-.03-.058-.032a6.49 6.49 0 01-.046-.026l-.094-.053-.06-.034-.051-.03-.072-.041-.082-.05-.093-.056-.052-.032-.084-.053-.061-.039-.079-.05-.07-.047-.053-.035a7.785 7.785 0 01-.054-.036l-.044-.03-.044-.03a6.066 6.066 0 01-.04-.028l-.057-.04-.076-.054-.069-.05-.074-.054-.056-.042-.076-.057-.076-.059-.086-.067-.045-.035-.064-.052-.074-.06-.089-.073-.046-.039-.046-.039a7.516 7.516 0 01-.043-.037l-.045-.04-.061-.053-.07-.062-.068-.06-.062-.058-.067-.062-.053-.05-.088-.084a13.28 13.28 0 01-.099-.097l-.029-.028-.041-.042-.069-.07-.05-.051-.05-.053a6.457 6.457 0 01-.168-.179l-.08-.088-.062-.07-.071-.08-.042-.049-.053-.062-.058-.068-.046-.056a7.175 7.175 0 01-.027-.033l-.045-.055-.066-.082-.041-.052-.05-.064-.02-.025a11.99 11.99 0 01-1.44-2.402zm-1.02-5.794l11.353 3.037a20.468 20.468 0 00-.469 2.011l10.817 2.894a12.076 12.076 0 01-1.845 2.005L.657 15.923l-.016-.046-.035-.104a11.965 11.965 0 01-.05-.153l-.007-.023a11.896 11.896 0 01-.207-.741l-.03-.126-.018-.08-.021-.097-.018-.081-.018-.09-.017-.084-.018-.094c-.026-.141-.05-.283-.071-.426l-.017-.118-.011-.083-.013-.102a12.01 12.01 0 01-.019-.161l-.005-.047a12.12 12.12 0 01-.034-2.145zm1.593-5.15l11.948 3.196c-.368.605-.705 1.231-1.01 1.875l11.295 3.022c-.142.82-.368 1.612-.668 2.365l-11.55-3.09L.124 10.26l.015-.1.008-.049.01-.067.015-.087.018-.098c.026-.148.056-.295.088-.442l.028-.124.02-.085.024-.097c.022-.09.045-.18.07-.268l.028-.102.023-.083.03-.1.025-.082.03-.096.026-.082.031-.095a11.896 11.896 0 011.01-2.232zm4.442-4.4L17.352 4.59a20.77 20.77 0 00-1.688 1.721l7.823 2.093c.267.852.442 1.744.513 2.665L2.106 5.213l.045-.065.027-.04.04-.055.046-.065.055-.076.054-.072.064-.086.05-.065.057-.073.055-.07.06-.074.055-.069.065-.077.054-.066.066-.077.053-.06.072-.082.053-.06.067-.074.054-.058.073-.078.058-.06.063-.067.168-.17.1-.098.059-.056.076-.071a12.084 12.084 0 012.272-1.677zM12.017 0h.097l.082.001.069.001.054.002.068.002.046.001.076.003.047.002.06.003.054.002.087.005.105.007.144.011.088.007.044.004.077.008.082.008.047.005.102.012.05.006.108.014.081.01.042.006.065.01.207.032.07.012.065.011.14.026.092.018.11.022.046.01.075.016.041.01L14.7.3l.042.01.065.015.049.012.071.017.096.024.112.03.113.03.113.032.05.015.07.02.078.024.073.023.05.016.05.016.076.025.099.033.102.036.048.017.064.023.093.034.11.041.116.045.1.04.047.02.06.024.041.018.063.026.04.018.057.025.11.048.1.046.074.035.075.036.06.028.092.046.091.045.102.052.053.028.049.026.046.024.06.033.041.022.052.029.088.05.106.06.087.051.057.034.053.032.096.059.088.055.098.062.036.024.064.041.084.056.04.027.062.042.062.043.023.017c.054.037.108.075.161.114l.083.06.065.048.056.043.086.065.082.064.04.03.05.041.086.069.079.065.085.071c.712.6 1.353 1.283 1.909 2.031L7.222.994l.062-.027.065-.028.081-.034.086-.035c.113-.045.227-.09.341-.131l.096-.035.093-.033.084-.03.096-.031c.087-.03.176-.058.264-.085l.091-.027.086-.025.102-.03.085-.023.1-.026L9.04.37l.09-.023.091-.022.095-.022.09-.02.098-.021.091-.02.095-.018.092-.018.1-.018.091-.016.098-.017.092-.014.097-.015.092-.013.102-.013.091-.012.105-.012.09-.01.105-.01c.093-.01.186-.018.28-.024l.106-.008.09-.005.11-.006.093-.004.1-.004.097-.002.099-.002.197-.002z"></path></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

+1
View File
@@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Nvidia</title><path d="M10.212 8.976V7.62c.127-.01.256-.017.388-.021 3.596-.117 5.957 3.184 5.957 3.184s-2.548 3.647-5.282 3.647a3.227 3.227 0 01-1.063-.175v-4.109c1.4.174 1.681.812 2.523 2.258l1.873-1.627a4.905 4.905 0 00-3.67-1.846 6.594 6.594 0 00-.729.044m0-4.476v2.025c.13-.01.259-.019.388-.024 5.002-.174 8.261 4.226 8.261 4.226s-3.743 4.69-7.643 4.69c-.338 0-.675-.031-1.007-.092v1.25c.278.038.558.057.838.057 3.629 0 6.253-1.91 8.794-4.169.421.347 2.146 1.193 2.501 1.564-2.416 2.083-8.048 3.763-11.24 3.763-.308 0-.603-.02-.894-.048V19.5H24v-15H10.21zm0 9.756v1.068c-3.356-.616-4.287-4.21-4.287-4.21a7.173 7.173 0 014.287-2.138v1.172h-.005a3.182 3.182 0 00-2.502 1.178s.615 2.276 2.507 2.931m-5.961-3.3c1.436-1.935 3.604-3.148 5.961-3.336V6.523C5.81 6.887 2 10.723 2 10.723s2.158 6.427 8.21 7.015v-1.166C5.77 16 4.25 10.958 4.25 10.958h-.002z" fill="#74B71B" fill-rule="nonzero"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+1
View File
@@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Ollama</title><path d="M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z"></path></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

Some files were not shown because too many files have changed in this diff Show More