Compare commits

..
605 Commits
Author SHA1 Message Date
jialin e7a9d2af00 chore: sharegpt description 2026-03-24 17:31:31 +08:00
jialin 59740d1601 fix: a non-running instance is selected in creating benchmark 2026-03-24 17:10:18 +08:00
jialin d874e502e2 fix: add ShareGPT profile 2026-03-24 16:20:03 +08:00
jialin 722b385bcb feat: add --openai-support 2026-03-23 15:59:11 +08:00
jialin aa7247baaf fix: copy failed in non-localhost and non-https 2026-03-23 12:31:45 +08:00
jialin 73f3cfceb1 fix(style): error message overlap input box 2026-03-19 14:02:16 +08:00
jialin f2fe080f7b fix: bedrock required fields 2026-03-18 18:31:29 +08:00
jialin eee73be77e fix: typos: position 2026-03-18 15:19:06 +08:00
jialin 6e4dd30104 fix: show required fields for provider 2026-03-18 15:01:04 +08:00
jialin 19b88f3375 fix: open the advanced when configured 2026-03-17 17:29:38 +08:00
jialin 94b3206111 fix: reset filter in export modal 2026-03-16 14:44:18 +08:00
jialin ea4ea56e59 fix: show backend warning hint after submitting in editing mode 2026-03-16 14:06:41 +08:00
jialin 042f8fed47 chore: update model cols 2026-03-16 11:11:46 +08:00
jialin f7c3b28cc8 style: same key tooltip 2026-03-16 10:31:57 +08:00
jialin 1462768aa9 fix: title for editing apikey 2026-03-12 19:34:14 +08:00
jialin 07fa3c8824 feat: add profile filter in benchmark 2026-03-12 18:51:10 +08:00
jialin 61f83f31d7 chore: add nvidia notes 2026-03-11 20:24:20 +08:00
jialin 6f2c1daa41 feat: display provider models 2026-03-11 20:00:16 +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
778 changed files with 58900 additions and 20825 deletions
+2 -1
View File
@@ -9,7 +9,8 @@ module.exports = {
}, },
globals: { globals: {
Global: 'readonly', Global: 'readonly',
React: 'readonly' React: 'readonly',
JSX: 'readonly'
}, },
ignorePatterns: ['public/static/'] ignorePatterns: ['public/static/']
}; };
+2 -2
View File
@@ -13,7 +13,7 @@ on:
- 'v*-dev' - 'v*-dev'
env: env:
NODE_VERSION: '21' NODE_VERSION: '22'
jobs: jobs:
deps: deps:
@@ -32,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
+1 -3
View File
@@ -1,4 +1,2 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged npx lint-staged
+1
View File
@@ -5,6 +5,7 @@
"max lint --fix --stylelint-only", "max lint --fix --stylelint-only",
"prettier --cache --write" "prettier --cache --write"
], ],
"!public/vs/**": [],
"*.ts?(x)": [ "*.ts?(x)": [
"max lint --fix --eslint-only", "max lint --fix --eslint-only",
"prettier --cache --parser=typescript --write" "prettier --cache --parser=typescript --write"
+1
View File
@@ -0,0 +1 @@
22
+11 -14
View File
@@ -1,9 +1,9 @@
import { defineConfig } from '@umijs/max'; import { defineConfig } from '@umijs/max';
import keepAlive from './keep-alive'; import keepAlive from './keep-alive';
import { compressionPluginConfig, monacoPluginConfig } from './plugins';
import proxy from './proxy'; import proxy from './proxy';
import routes from './routes'; import routes from './routes';
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);
@@ -56,21 +56,15 @@ 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',
@@ -84,6 +78,9 @@ export default defineConfig({
model: {}, model: {},
initialState: {}, initialState: {},
request: {}, request: {},
routePrefetch: {
defaultPrefetch: 'intent'
},
keepalive: keepAlive, keepalive: keepAlive,
locale: { locale: {
antd: true, antd: true,
+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
}
]);
}
+3 -1
View File
@@ -1,11 +1,13 @@
const proxyTableList = [ const proxyTableList = [
'cli', 'cli',
'v1', 'v1',
'v2',
'auth', 'auth',
'v1-openai', 'v1-openai',
'version', 'version',
'proxy', 'proxy',
'update' 'update',
'grafana'
]; ];
// @ts-ingore // @ts-ingore
+109 -4
View File
@@ -80,7 +80,6 @@ export default [
name: 'models', name: 'models',
path: '/models', path: '/models',
key: 'models', key: 'models',
access: 'canSeeAdmin',
routes: [ routes: [
{ {
path: '/models', path: '/models',
@@ -100,11 +99,63 @@ export default [
name: 'deployment', name: 'deployment',
path: '/models/deployments', path: '/models/deployments',
key: 'modelDeployments', key: 'modelDeployments',
icon: 'icon-model', icon: 'icon-rocket-launch1',
selectedIcon: 'icon-model-filled', selectedIcon: 'icon-rocket-launch-fill',
defaultIcon: 'icon-model', defaultIcon: 'icon-rocket-launch1',
access: 'canSeeAdmin', access: 'canSeeAdmin',
component: './llmodels/index' component: './llmodels/index'
},
{
name: 'routes',
path: '/models/routes',
key: 'routes',
icon: 'icon-captive_portal',
selectedIcon: 'icon-captive_portal',
defaultIcon: 'icon-captive_portal',
access: 'canSeeAdmin',
component: './model-routes/index'
},
{
name: 'providers',
path: '/models/providers',
key: 'modelProviders',
icon: 'icon-extension-outline',
selectedIcon: 'icon-extension-filled',
defaultIcon: 'icon-extension-outline',
access: 'canSeeAdmin',
component: './maas-provider/index'
},
{
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: 'benchmark',
path: '/models/benchmark',
key: 'benchmark',
icon: 'icon-speed',
selectedIcon: 'icon-speed-filled',
defaultIcon: 'icon-speed',
access: 'canSeeAdmin',
component: './benchmark/index'
},
{
name: 'benchmarkDetail',
path: '/models/benchmark/detail',
key: 'benchmarkDetail',
icon: 'icon-speed',
selectedIcon: 'icon-speed-filled',
defaultIcon: 'icon-speed',
access: 'canSeeAdmin',
hideInMenu: true,
component: './benchmark/details'
} }
] ]
}, },
@@ -136,6 +187,16 @@ export default [
defaultIcon: 'icon-gpu1', defaultIcon: 'icon-gpu1',
component: './resources/components/gpus' component: './resources/components/gpus'
}, },
{
name: 'backendsList',
path: '/resources/backends',
key: 'backendsList',
icon: 'icon-backend',
selectedIcon: 'icon-backend-filled',
defaultIcon: 'icon-backend',
access: 'canSeeAdmin',
component: './backends/index'
},
{ {
name: 'modelfiles', name: 'modelfiles',
path: '/resources/modelfiles', path: '/resources/modelfiles',
@@ -147,6 +208,50 @@ export default [
} }
] ]
}, },
{
name: 'clusterManagement',
path: '/cluster-management',
key: 'clusterManagement',
access: 'canSeeAdmin',
routes: [
{
path: '/cluster-management',
redirect: '/cluster-management/clusters/list'
},
{
name: 'clusters',
path: '/cluster-management/clusters/list',
key: 'clusters',
icon: 'icon-cluster2-outline',
selectedIcon: 'icon-cluster2-filled',
defaultIcon: 'icon-cluster2-outline',
component: './cluster-management/clusters',
subMenu: [
'/cluster-management/clusters/detail',
'/cluster-management/clusters/create'
]
},
{
name: 'clusterDetail',
path: '/cluster-management/clusters/detail',
key: 'clusterDetail',
icon: 'icon-cluster2-outline',
selectedIcon: 'icon-cluster2-filled',
defaultIcon: 'icon-cluster2-outline',
hideInMenu: true,
component: './cluster-management/cluster-detail'
},
{
name: 'credentials',
path: '/cluster-management/credentials',
key: 'credentials',
icon: 'icon-credential-outline',
selectedIcon: 'icon-credential-filled',
defaultIcon: 'icon-credential-outline',
component: './cluster-management/credentials'
}
]
},
{ {
name: 'accessControl', name: 'accessControl',
path: '/access-control', path: '/access-control',
+17 -6
View File
@@ -16,8 +16,8 @@
"immer": "^9.0.6" "immer": "^9.0.6"
}, },
"dependencies": { "dependencies": {
"@ant-design/icons": "^5.5.1", "@ant-design/icons": "^6.1.0",
"@ant-design/pro-components": "^2.7.19", "@ant-design/pro-components": "3.1.0-0",
"@braintree/sanitize-url": "^7.1.1", "@braintree/sanitize-url": "^7.1.1",
"@huggingface/gguf": "^0.1.7", "@huggingface/gguf": "^0.1.7",
"@huggingface/hub": "^0.15.1", "@huggingface/hub": "^0.15.1",
@@ -26,12 +26,12 @@
"@orcid/bibtex-parse-js": "^0.0.25", "@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", "ahooks": "^3.8.5",
"ansi-to-html": "^0.7.2", "ansi-to-html": "^0.7.2",
"antd": "^5.21.6", "antd": "^6.1.2",
"antd-style": "^3.6.2", "antd-style": "^3.6.2",
"axios": "^1.8.2", "axios": "^1.8.2",
"classnames": "^2.5.1", "classnames": "^2.5.1",
@@ -45,7 +45,9 @@
"file-saver": "^2.0.5", "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",
"jszip": "^3.10.1", "jszip": "^3.10.1",
"katex": "^0.16.21", "katex": "^0.16.21",
"lamejs": "github:zhuker/lamejs", "lamejs": "github:zhuker/lamejs",
@@ -53,33 +55,41 @@
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mammoth": "^1.8.0", "mammoth": "^1.8.0",
"marked": "^14.1.0", "marked": "^14.1.0",
"minimatch": "^3.1.2",
"ml-dataset-iris": "^1.2.1", "ml-dataset-iris": "^1.2.1",
"ml-pca": "^4.1.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": "^2.10.0",
"overlayscrollbars-react": "^0.5.6", "overlayscrollbars-react": "^0.5.6",
"pdfjs-dist": "^4.7.76", "pdfjs-dist": "^4.7.76",
"query-string": "^9.0.0", "query-string": "^9.0.0",
"rc-resize-observer": "^1.4.0", "rc-resize-observer": "^1.4.3",
"rc-virtual-list": "^3.14.8", "rc-virtual-list": "^3.14.8",
"re-resizable": "^6.10.1", "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-markdown": "^9.0.3",
"rehype-katex": "^7.0.1", "rehype-katex": "^7.0.1",
"remark-breaks": "^4.0.0",
"remark-gfm": "^4.0.1", "remark-gfm": "^4.0.1",
"remark-math": "^6.0.0", "remark-math": "^6.0.0",
"semver": "^7.7.3",
"simplebar-react": "^3.2.6", "simplebar-react": "^3.2.6",
"styled-components": "^6.1.15", "styled-components": "^6.1.15",
"tinycolor2": "^1.6.0",
"umi-presets-pro": "^2.0.3", "umi-presets-pro": "^2.0.3",
"wavesurfer.js": "^7.8.8", "wavesurfer.js": "^7.8.8",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
}, },
"devDependencies": { "devDependencies": {
"@types/marked": "^6.0.0", "@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",
"@umijs/case-sensitive-paths-webpack-plugin": "^1.0.1", "@umijs/case-sensitive-paths-webpack-plugin": "^1.0.1",
"@umijs/plugins": "^4.4.11", "@umijs/plugins": "^4.4.11",
"babel-plugin-named-asset-import": "^0.3.8", "babel-plugin-named-asset-import": "^0.3.8",
@@ -94,6 +104,7 @@
"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",
+5609 -9147
View File
File diff suppressed because it is too large Load Diff
+7
View File
@@ -4,8 +4,15 @@ export default (initialState: { currentUser?: Global.UserInfo }) => {
initialState.currentUser && initialState.currentUser &&
initialState.currentUser.is_admin initialState.currentUser.is_admin
); );
const canSeeUser = !!(
initialState &&
initialState.currentUser &&
!initialState.currentUser.is_admin
);
return { return {
canSeeAdmin, canSeeAdmin,
canSeeUser,
canDelete: true, canDelete: true,
canLogin: true canLogin: true
}; };
+30 -10
View File
@@ -1,11 +1,13 @@
import { GPUStackVersionAtom, UpdateCheckAtom } from '@/atoms/user'; import { GPUStackVersionAtom, UpdateCheckAtom } 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 { requestConfig } from '@/request-config'; import { requestConfig } from '@/request-config';
import { import {
queryCurrentUserState, queryCurrentUserState,
queryVersionInfo, queryVersionInfo,
updateCheck updateCheck
} from '@/services/profile/apis'; } from '@/services/profile/apis';
import { fetchSystemConfig } from '@/services/system/query-system-config';
import { isOnline } from '@/utils'; import { isOnline } from '@/utils';
import { import {
IS_FIRST_LOGIN, IS_FIRST_LOGIN,
@@ -13,8 +15,7 @@ import {
writeState writeState
} from '@/utils/localstore/index'; } from '@/utils/localstore/index';
import { RequestConfig, history } from '@umijs/max'; import { RequestConfig, history } from '@umijs/max';
import { message } from 'antd';
const loginPath = '/login';
// only for the first login and access from http://localhost // only for the first login and access from http://localhost
@@ -23,7 +24,7 @@ const checkDefaultPage = async (userInfo: any) => {
if (isFirstLogin === null && isOnline()) { if (isFirstLogin === null && isOnline()) {
writeState(IS_FIRST_LOGIN, true); writeState(IS_FIRST_LOGIN, true);
if (userInfo && userInfo?.is_admin) { if (userInfo && userInfo?.is_admin) {
history.push('/models/deployments'); history.push(DEFAULT_ENTER_PAGE.adminForFirst);
} }
} }
}; };
@@ -48,17 +49,31 @@ export async function getInitialState(): Promise<{
} }
}; };
const fetchUserInfo = async (): Promise<Global.UserInfo> => { 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) { if (data.is_admin) {
getUpdateCheck(); getUpdateCheck();
fetchSystemConfig();
} }
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;
}; };
@@ -66,10 +81,15 @@ export async function getInitialState(): Promise<{
const getAppVersionInfo = async () => { const getAppVersionInfo = async () => {
try { try {
const data = await queryVersionInfo(); const data = await queryVersionInfo();
const isProduction = data.version?.indexOf('0.0.0') === -1;
const isDev = data.version?.indexOf('0.0.0') > -1;
const isRc = data.version?.indexOf('rc') > -1;
setAtomStorage(GPUStackVersionAtom, { setAtomStorage(GPUStackVersionAtom, {
...data, ...data,
isProduction isProd: !isDev && !isRc,
isDev,
isRc
}); });
} catch (error) { } catch (error) {
console.error('queryVersionInfo error', error); console.error('queryVersionInfo error', error);
@@ -78,7 +98,7 @@ 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 = await fetchUserInfo();
checkDefaultPage(userInfo); checkDefaultPage(userInfo);
return { return {
@@ -92,6 +112,6 @@ export async function getInitialState(): Promise<{
} }
export const request: RequestConfig = { export const request: RequestConfig = {
baseURL: ' /v1', baseURL: `/${GPUSTACK_API_BASE_URL}`,
...requestConfig ...requestConfig
}; };
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

+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: 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: 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: 393 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 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

+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>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

+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>OpenAI</title><path d="M21.55 10.004a5.416 5.416 0 00-.478-4.501c-1.217-2.09-3.662-3.166-6.05-2.66A5.59 5.59 0 0010.831 1C8.39.995 6.224 2.546 5.473 4.838A5.553 5.553 0 001.76 7.496a5.487 5.487 0 00.691 6.5 5.416 5.416 0 00.477 4.502c1.217 2.09 3.662 3.165 6.05 2.66A5.586 5.586 0 0013.168 23c2.443.006 4.61-1.546 5.361-3.84a5.553 5.553 0 003.715-2.66 5.488 5.488 0 00-.693-6.497v.001zm-8.381 11.558a4.199 4.199 0 01-2.675-.954c.034-.018.093-.05.132-.074l4.44-2.53a.71.71 0 00.364-.623v-6.176l1.877 1.069c.02.01.033.029.036.05v5.115c-.003 2.274-1.87 4.118-4.174 4.123zM4.192 17.78a4.059 4.059 0 01-.498-2.763c.032.02.09.055.131.078l4.44 2.53c.225.13.504.13.73 0l5.42-3.088v2.138a.068.068 0 01-.027.057L9.9 19.288c-1.999 1.136-4.552.46-5.707-1.51h-.001zM3.023 8.216A4.15 4.15 0 015.198 6.41l-.002.151v5.06a.711.711 0 00.364.624l5.42 3.087-1.876 1.07a.067.067 0 01-.063.005l-4.489-2.559c-1.995-1.14-2.679-3.658-1.53-5.63h.001zm15.417 3.54l-5.42-3.088L14.896 7.6a.067.067 0 01.063-.006l4.489 2.557c1.998 1.14 2.683 3.662 1.529 5.633a4.163 4.163 0 01-2.174 1.807V12.38a.71.71 0 00-.363-.623zm1.867-2.773a6.04 6.04 0 00-.132-.078l-4.44-2.53a.731.731 0 00-.729 0l-5.42 3.088V7.325a.068.068 0 01.027-.057L14.1 4.713c2-1.137 4.555-.46 5.707 1.513.487.833.664 1.809.499 2.757h.001zm-11.741 3.81l-1.877-1.068a.065.065 0 01-.036-.051V6.559c.001-2.277 1.873-4.122 4.181-4.12.976 0 1.92.338 2.671.954-.034.018-.092.05-.131.073l-4.44 2.53a.71.71 0 00-.365.623l-.003 6.173v.002zm1.02-2.168L12 9.25l2.414 1.375v2.75L12 14.75l-2.415-1.375v-2.75z"></path></svg>

After

Width:  |  Height:  |  Size: 1.7 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>OpenRouter</title><path d="M16.804 1.957l7.22 4.105v.087L16.73 10.21l.017-2.117-.821-.03c-1.059-.028-1.611.002-2.268.11-1.064.175-2.038.577-3.147 1.352L8.345 11.03c-.284.195-.495.336-.68.455l-.515.322-.397.234.385.23.53.338c.476.314 1.17.796 2.701 1.866 1.11.775 2.083 1.177 3.147 1.352l.3.045c.694.091 1.375.094 2.825.033l.022-2.159 7.22 4.105v.087L16.589 22l.014-1.862-.635.022c-1.386.042-2.137.002-3.138-.162-1.694-.28-3.26-.926-4.881-2.059l-2.158-1.5a21.997 21.997 0 00-.755-.498l-.467-.28a55.927 55.927 0 00-.76-.43C2.908 14.73.563 14.116 0 14.116V9.888l.14.004c.564-.007 2.91-.622 3.809-1.124l1.016-.58.438-.274c.428-.28 1.072-.726 2.686-1.853 1.621-1.133 3.186-1.78 4.881-2.059 1.152-.19 1.974-.213 3.814-.138l.02-1.907z"></path></svg>

After

Width:  |  Height:  |  Size: 906 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>Qwen</title><path d="M12.604 1.34c.393.69.784 1.382 1.174 2.075a.18.18 0 00.157.091h5.552c.174 0 .322.11.446.327l1.454 2.57c.19.337.24.478.024.837-.26.43-.513.864-.76 1.3l-.367.658c-.106.196-.223.28-.04.512l2.652 4.637c.172.301.111.494-.043.77-.437.785-.882 1.564-1.335 2.34-.159.272-.352.375-.68.37-.777-.016-1.552-.01-2.327.016a.099.099 0 00-.081.05 575.097 575.097 0 01-2.705 4.74c-.169.293-.38.363-.725.364-.997.003-2.002.004-3.017.002a.537.537 0 01-.465-.271l-1.335-2.323a.09.09 0 00-.083-.049H4.982c-.285.03-.553-.001-.805-.092l-1.603-2.77a.543.543 0 01-.002-.54l1.207-2.12a.198.198 0 000-.197 550.951 550.951 0 01-1.875-3.272l-.79-1.395c-.16-.31-.173-.496.095-.965.465-.813.927-1.625 1.387-2.436.132-.234.304-.334.584-.335a338.3 338.3 0 012.589-.001.124.124 0 00.107-.063l2.806-4.895a.488.488 0 01.422-.246c.524-.001 1.053 0 1.583-.006L11.704 1c.341-.003.724.032.9.34zm-3.432.403a.06.06 0 00-.052.03L6.254 6.788a.157.157 0 01-.135.078H3.253c-.056 0-.07.025-.041.074l5.81 10.156c.025.042.013.062-.034.063l-2.795.015a.218.218 0 00-.2.116l-1.32 2.31c-.044.078-.021.118.068.118l5.716.008c.046 0 .08.02.104.061l1.403 2.454c.046.081.092.082.139 0l5.006-8.76.783-1.382a.055.055 0 01.096 0l1.424 2.53a.122.122 0 00.107.062l2.763-.02a.04.04 0 00.035-.02.041.041 0 000-.04l-2.9-5.086a.108.108 0 010-.113l.293-.507 1.12-1.977c.024-.041.012-.062-.035-.062H9.2c-.059 0-.073-.026-.043-.077l1.434-2.505a.107.107 0 000-.114L9.225 1.774a.06.06 0 00-.053-.031zm6.29 8.02c.046 0 .058.02.034.06l-.832 1.465-2.613 4.585a.056.056 0 01-.05.029.058.058 0 01-.05-.029L8.498 9.841c-.02-.034-.01-.052.028-.054l.216-.012 6.722-.012z" fill="url(#lobe-icons-qwen-fill)" fill-rule="nonzero"></path><defs><linearGradient id="lobe-icons-qwen-fill" x1="0%" x2="100%" y1="0%" y2="0%"><stop offset="0%" stop-color="#6336E7" stop-opacity=".84"></stop><stop offset="100%" stop-color="#6F69F7" stop-opacity=".84"></stop></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 2.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>Spark</title><path d="M2 13.08C2 9.182 4.772 6.367 9.32 2.122c-.65 7.883 6.41 8.272 5.023 12.214-.99 2.815-4.244 1.949-4.59 1.342 0 0 1.212.347 1.385-.866.174-1.213-2.252-1.862-3.81-4.937-2.6 2.988-.954 9.008 4.2 9.008 4.764 0 6.583-4.937 4.894-8.099 0 0 4.071.693 4.418 3.811.346 3.119-3.638 8.533-9.095 8.403C6.288 22.868 2 18.84 2 13.08z" fill="#3DC8F9"></path><path d="M17.852 6.107L11.615 0c-.52 5.933.866 8.374 4.894 9.485 2.729.753 3.307 1.04 4.504 2.772-.338-2.407-.78-3.812-3.161-6.15z" fill="#EA0100"></path><path clip-rule="evenodd" d="M9.033 18.323c.709.354 1.542.56 2.495.56 4.764 0 6.583-4.937 4.894-8.099 0 0 4.071.693 4.418 3.811.156 1.403-.565 3.27-1.902 4.89-3.458 1.57-7.29.84-9.905-1.162z" fill="#1652D8" fill-rule="evenodd"></path></svg>

After

Width:  |  Height:  |  Size: 882 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>Stepfun</title><path d="M22.012 0h1.032v.927H24v.968h-.956V3.78h-1.032V1.896h-1.878v-.97h1.878V0zM2.6 12.371V1.87h.969v10.502h-.97zm10.423.66h10.95v.918h-6.208v9.579h-4.742V13.03zM5.629 3.333v12.356H0v4.51h10.386V8L20.859 8l-.003-4.668-15.227.001z" fill="url(#lobe-icons-stepfun-fill)" fill-rule="evenodd"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-stepfun-fill" x1="1.646" x2="18.342" y1="1.916" y2="22.091"><stop stop-color="#01A9FF"></stop><stop offset="1" stop-color="#0160FF"></stop></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 674 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>together.ai</title><path d="M17.385 11.23a4.615 4.615 0 100-9.23 4.615 4.615 0 000 9.23zm0 10.77a4.615 4.615 0 100-9.23 4.615 4.615 0 000 9.23zm-10.77 0a4.615 4.615 0 100-9.23 4.615 4.615 0 000 9.23z" opacity=".2"></path><circle cx="6.615" cy="6.615" fill="#0F6FFF" r="4.615"></circle></svg>

After

Width:  |  Height:  |  Size: 455 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>Yi</title><path d="M18.62 13.927c.611 0 1.107.505 1.107 1.128v5.817c0 .623-.496 1.128-1.108 1.128a1.118 1.118 0 01-1.108-1.128v-5.817c0-.623.496-1.128 1.108-1.128zM16.59 3.052a1.094 1.094 0 011.562-.129c.466.404.522 1.116.126 1.59l-5.938 7.111v9.147c0 .624-.496 1.129-1.108 1.129a1.118 1.118 0 01-1.108-1.129v-9.477l.003-.088.01-.087c.015-.232.102-.462.261-.654l6.192-7.413zM2.906 2.256a1.094 1.094 0 011.559.157l4.387 5.45a1.142 1.142 0 01-.155 1.587 1.094 1.094 0 01-1.559-.157l-4.387-5.45a1.144 1.144 0 01.06-1.498l.095-.09z"></path><ellipse cx="20.146" cy="10.692" fill="#00FF25" rx="1.354" ry="1.379"></ellipse></svg>

After

Width:  |  Height:  |  Size: 786 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>Zhipu</title><path d="M11.991 23.503a.24.24 0 00-.244.248.24.24 0 00.244.249.24.24 0 00.245-.249.24.24 0 00-.22-.247l-.025-.001zM9.671 5.365a1.697 1.697 0 011.099 2.132l-.071.172-.016.04-.018.054c-.07.16-.104.32-.104.498-.035.71.47 1.279 1.186 1.314h.366c1.309.053 2.338 1.173 2.286 2.523-.052 1.332-1.152 2.38-2.478 2.327h-.174c-.715.018-1.274.64-1.239 1.368 0 .124.018.23.053.337.209.373.54.658.96.8.75.23 1.517-.125 1.9-.782l.018-.035c.402-.64 1.17-.96 1.92-.711.854.284 1.378 1.226 1.099 2.167a1.661 1.661 0 01-2.077 1.102 1.711 1.711 0 01-.907-.711l-.017-.035c-.2-.323-.463-.58-.851-.711l-.056-.018a1.646 1.646 0 00-1.954.746 1.66 1.66 0 01-1.065.764 1.677 1.677 0 01-1.989-1.279c-.209-.906.332-1.83 1.257-2.043a1.51 1.51 0 01.296-.035h.018c.68-.071 1.151-.622 1.116-1.333a1.307 1.307 0 00-.227-.693 2.515 2.515 0 01-.366-1.403 2.39 2.39 0 01.366-1.208c.14-.195.21-.444.227-.693.018-.71-.506-1.261-1.186-1.332l-.07-.018a1.43 1.43 0 01-.299-.07l-.05-.019a1.7 1.7 0 01-1.047-2.114 1.68 1.68 0 012.094-1.101zm-5.575 10.11c.26-.264.639-.367.994-.27.355.096.633.379.728.74.095.362-.007.748-.267 1.013-.402.41-1.053.41-1.455 0a1.062 1.062 0 010-1.482zm14.845-.294c.359-.09.738.024.992.297.254.274.344.665.237 1.025-.107.36-.396.634-.756.718-.551.128-1.1-.22-1.23-.781a1.05 1.05 0 01.757-1.26zm-.064-4.39c.314.32.49.753.49 1.206 0 .452-.176.886-.49 1.206-.315.32-.74.5-1.185.5-.444 0-.87-.18-1.184-.5a1.727 1.727 0 010-2.412 1.654 1.654 0 012.369 0zm-11.243.163c.364.484.447 1.128.218 1.691a1.665 1.665 0 01-2.188.923c-.855-.36-1.26-1.358-.907-2.228a1.68 1.68 0 011.33-1.038c.593-.08 1.183.169 1.547.652zm11.545-4.221c.368 0 .708.2.892.524.184.324.184.724 0 1.048a1.026 1.026 0 01-.892.524c-.568 0-1.03-.47-1.03-1.048 0-.579.462-1.048 1.03-1.048zm-14.358 0c.368 0 .707.2.891.524.184.324.184.724 0 1.048a1.026 1.026 0 01-.891.524c-.569 0-1.03-.47-1.03-1.048 0-.579.461-1.048 1.03-1.048zm10.031-1.475c.925 0 1.675.764 1.675 1.706s-.75 1.705-1.675 1.705-1.674-.763-1.674-1.705c0-.942.75-1.706 1.674-1.706zm-2.626-.684c.362-.082.653-.356.761-.718a1.062 1.062 0 00-.238-1.028 1.017 1.017 0 00-.996-.294c-.547.14-.881.7-.752 1.257.13.558.675.907 1.225.783zm0 16.876c.359-.087.644-.36.75-.72a1.062 1.062 0 00-.237-1.019 1.018 1.018 0 00-.985-.301 1.037 1.037 0 00-.762.717c-.108.361-.017.754.239 1.028.245.263.606.377.953.305l.043-.01zM17.19 3.5a.631.631 0 00.628-.64c0-.355-.279-.64-.628-.64a.631.631 0 00-.628.64c0 .355.28.64.628.64zm-10.38 0a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64a.631.631 0 00-.628.64c0 .355.279.64.628.64zm-5.182 7.852a.631.631 0 00-.628.64c0 .354.28.639.628.639a.63.63 0 00.627-.606l.001-.034a.62.62 0 00-.628-.64zm5.182 9.13a.631.631 0 00-.628.64c0 .355.279.64.628.64a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64zm10.38.018a.631.631 0 00-.628.64c0 .355.28.64.628.64a.631.631 0 00.628-.64c0-.355-.279-.64-.628-.64zm5.182-9.148a.631.631 0 00-.628.64c0 .354.279.639.628.639a.631.631 0 00.628-.64c0-.355-.28-.64-.628-.64zm-.384-4.992a.24.24 0 00.244-.249.24.24 0 00-.244-.249.24.24 0 00-.244.249c0 .142.122.249.244.249zM11.991.497a.24.24 0 00.245-.248A.24.24 0 0011.99 0a.24.24 0 00-.244.249c0 .133.108.236.223.247l.021.001zM2.011 6.36a.24.24 0 00.245-.249.24.24 0 00-.244-.249.24.24 0 00-.244.249.24.24 0 00.244.249zm0 11.263a.24.24 0 00-.243.248.24.24 0 00.244.249.24.24 0 00.244-.249.252.252 0 00-.244-.248zm19.995-.018a.24.24 0 00-.245.248.24.24 0 00.245.25.24.24 0 00.244-.25.252.252 0 00-.244-.248z" fill="#3859FF" fill-rule="nonzero"></path></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

+49
View File
@@ -1,3 +1,5 @@
@import './table.less';
.m-b-20 { .m-b-20 {
margin-bottom: 20px; margin-bottom: 20px;
} }
@@ -26,6 +28,10 @@
margin-left: 5px; margin-left: 5px;
} }
.m-l-24 {
margin-left: 24px;
}
.m-l-4 { .m-l-4 {
margin-left: 4px; margin-left: 4px;
} }
@@ -98,12 +104,22 @@
display: flex; display: flex;
} }
.flex-full {
display: flex;
flex: 1;
}
// space-between // space-between
.flex-between { .flex-between {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.justify-between {
display: flex;
justify-content: space-between;
}
.justify-center { .justify-center {
display: flex; display: flex;
justify-content: center; justify-content: center;
@@ -164,6 +180,10 @@
gap: 8px; gap: 8px;
} }
.gap-4 {
gap: 4px;
}
.gap-20 { .gap-20 {
gap: 20px; gap: 20px;
} }
@@ -220,6 +240,10 @@
margin-bottom: 0; margin-bottom: 0;
} }
.m-t-0 {
margin-top: 0;
}
.m-b-16 { .m-b-16 {
margin-bottom: 16px; margin-bottom: 16px;
} }
@@ -244,6 +268,10 @@
font-weight: var(--font-weight-bold); font-weight: var(--font-weight-bold);
} }
.text-primary {
color: var(--ant-color-text);
}
.text-secondary { .text-secondary {
color: var(--ant-color-text-secondary); color: var(--ant-color-text-secondary);
} }
@@ -252,6 +280,10 @@
color: var(--ant-color-text-tertiary); color: var(--ant-color-text-tertiary);
} }
.text-quaternary {
color: var(--ant-color-text-quaternary);
}
.tips-desc-list { .tips-desc-list {
list-style-type: decimal; list-style-type: decimal;
padding-left: 16px; padding-left: 16px;
@@ -319,3 +351,20 @@ textarea:hover {
.ant-result-extra { .ant-result-extra {
color: var(--ant-color-text-secondary); color: var(--ant-color-text-secondary);
} }
.text-success {
color: var(--ant-color-success);
}
.desc-fill {
font-weight: 600;
color: var(--ant-color-text);
background-color: var(--ant-color-fill-content);
line-height: 1.5;
padding: 2px 6px;
border-radius: 4px;
}
.line-6 {
line-height: 24px;
}
+9 -2
View File
@@ -3,8 +3,7 @@
.ant-layout-sider-children { .ant-layout-sider-children {
border-inline: none; border-inline: none;
border-radius: 0; border-radius: 0;
// padding-inline: 16px; padding-block-end: 8px;
padding-block-end: 12px;
} }
.umi-plugin-layout-right { .umi-plugin-layout-right {
@@ -22,3 +21,11 @@
} }
} }
} }
// slider styles
.ant-slider .ant-slider-handle:hover::after,
.ant-slider .ant-slider-handle:active::after,
.ant-slider .ant-slider-handle:focus::after {
outline-width: 3px;
}
+10
View File
@@ -0,0 +1,10 @@
.ant-table-thead {
.ant-table-column-sorters {
.ant-table-column-title {
min-width: 32px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
}
}
+3
View File
@@ -0,0 +1,3 @@
import { atom } from 'jotai';
export const enabledBackendsAtom = atom<any>(null);
+15
View File
@@ -0,0 +1,15 @@
import { atom } from 'jotai';
export const benchmarkTargetInstanceAtom = atom<{
cluster_id: number | null;
model_name: string;
model_id: number | null;
model_instance_name: string;
model_instance: string[];
}>({
cluster_id: null,
model_name: '',
model_id: null,
model_instance_name: '',
model_instance: []
});
+70
View File
@@ -0,0 +1,70 @@
import { ClusterListItem } from '@/pages/cluster-management/config/types';
import { atom } from 'jotai';
// models expand keys: create, update , delete,
export const expandKeysAtom = atom<string[]>([]);
export const regionListAtom = atom<
{
datacenter: string;
label: string;
value: string;
icon: string;
sizes: string[];
}[]
>([]);
export const regionInstanceTypeListAtom = atom<
{
label: string;
value: string;
description: string;
specInfo: Record<string, any>;
vendor: string;
available: boolean;
regions: string[];
}[]
>([]);
export const regionOSImageListAtom = atom<
{
label: string;
value: string;
os_image: string;
name: string;
description: string;
vendor: string;
specInfo: Record<string, any>;
regions: string[];
}[]
>([]);
export const allRegionOSImageListAtom = atom<
{
label: string;
value: string;
regions: string[];
}[]
>([]);
export const allRegionInstanceTypeListAtom = atom<
{
label: string;
value: string;
regions: string[];
}[]
>([]);
export const fromClusterCreationAtom = atom(false);
/**
* for temporary cluster session storage during creation/editing
*/
export const clusterSessionAtom = atom<{
firstAddWorker: boolean;
firstAddCluster: boolean;
} | null>(null);
export const clusterDetailAtom = atom<ClusterListItem | null>(null);
export const workerAddedCountAtom = atom(0);
+41
View File
@@ -1,8 +1,11 @@
import { BackendOption } from '@/pages/llmodels/config/types';
import { atom, getDefaultStore } from 'jotai'; import { atom, getDefaultStore } from 'jotai';
// models expand keys: create, update , delete, // models expand keys: create, update , delete,
export const modelsExpandKeysAtom = atom<string[]>([]); export const modelsExpandKeysAtom = atom<string[]>([]);
export const modelsSessionAtom = atom<Record<string, any>>({});
export const requestIdAtom = atom<number>(0); export const requestIdAtom = atom<number>(0);
export const setRquestId = () => { export const setRquestId = () => {
@@ -16,3 +19,41 @@ export const getRequestId = () => {
const store = getDefaultStore(); const store = getDefaultStore();
return store.get(requestIdAtom); return store.get(requestIdAtom);
}; };
// store for cluster list: res.items from api
export const clusterListAtom = atom<
{
label: string;
value: number;
provider: string;
state: string;
is_default: boolean;
workers: number;
ready_workers: number;
gpus: number;
}[]
>([]);
// store for worker list: res.items from api
export const workerListAtom = atom<
{
label: string;
value: number;
cluster_id: number;
state: string;
id: number;
labels: Record<string, any>;
name: string;
}[]
>([]);
export interface BackGroupOption {
label: string;
value: string;
title?: string;
options: BackendOption[];
}
export const backendOptionsAtom = atom<BackGroupOption[]>([]);
export const resourceOverviewAtom = atom<Record<string, any>>({});
+6
View File
@@ -0,0 +1,6 @@
import { atom } from 'jotai';
export const registerRouteConfigAtom = atom<Record<string, any>>({
initialValues: null,
create: false
});
+11 -9
View File
@@ -1,4 +1,4 @@
import { colorPrimary } from '@/config/theme'; import { COLOR_PRIMARY } from '@/config/theme';
import { atom } from 'jotai'; import { atom } from 'jotai';
import { atomWithStorage } from 'jotai/utils'; import { atomWithStorage } from 'jotai/utils';
@@ -8,14 +8,16 @@ type UserSettings = {
colorPrimary: string; colorPrimary: string;
isDarkTheme: boolean; isDarkTheme: boolean;
collapsed: boolean; collapsed: boolean;
hideAddResourceModal?: boolean;
}; };
const defaultSettings: UserSettings = { export const defaultSettings: UserSettings = {
theme: 'light', theme: 'light',
mode: 'auto', mode: 'auto',
isDarkTheme: false, isDarkTheme: false,
colorPrimary: colorPrimary, colorPrimary: COLOR_PRIMARY,
collapsed: false collapsed: false,
hideAddResourceModal: false
}; };
export const getStorageUserSettings = () => { export const getStorageUserSettings = () => {
@@ -33,10 +35,9 @@ export const getStorageUserSettings = () => {
} }
}; };
export const userSettingsAtom = atomWithStorage<UserSettings>( export const userSettingsAtom = atomWithStorage<UserSettings>('userSettings', {
'userSettings', ...getStorageUserSettings()
defaultSettings });
);
export const userSettingsHelperAtom = atom( export const userSettingsHelperAtom = atom(
(get) => get(userSettingsAtom), (get) => get(userSettingsAtom),
@@ -48,8 +49,9 @@ export const userSettingsHelperAtom = atom(
}; };
set(userSettingsAtom, { set(userSettingsAtom, {
...newSettings, ...newSettings,
colorPrimary: newSettings.colorPrimary || colorPrimary, colorPrimary: newSettings.colorPrimary || COLOR_PRIMARY,
isDarkTheme: newSettings.theme === 'realDark' isDarkTheme: newSettings.theme === 'realDark'
}); });
} }
); );
export const hideModalTemporarilyAtom = atom<boolean>(false);
+14
View File
@@ -0,0 +1,14 @@
import { atom } from 'jotai';
export interface SystemConfig {
grafana_url: string;
disable_builtin_observability: boolean;
debug: boolean;
grafana_model_dashboard_uid: string;
grafana_worker_dashboard_uid: string;
system_default_container_registry: string | null;
server_external_url: string | null;
showMonitoring?: boolean;
}
export const systemConfigAtom = atom<SystemConfig>({} as SystemConfig);
+6 -2
View File
@@ -6,11 +6,15 @@ export const userAtom = atomWithStorage<any>('userInfo', null);
export const GPUStackVersionAtom = atom<{ export const GPUStackVersionAtom = atom<{
version: string; version: string;
git_commit: string; git_commit: string;
isProduction: boolean; isProd: boolean;
isDev?: boolean;
isRc?: boolean;
}>({ }>({
version: '', version: '',
git_commit: '', git_commit: '',
isProduction: false isProd: false,
isDev: false,
isRc: false
}); });
export const UpdateCheckAtom = atom<{ export const UpdateCheckAtom = atom<{
+33
View File
@@ -1,5 +1,38 @@
import { defaultSettings } from '@/atoms/settings';
import { getDefaultStore } from 'jotai'; import { getDefaultStore } from 'jotai';
export const clearStorageUserSettings = () => {
try {
const savedSettings = JSON.parse(
localStorage.getItem('userSettings') || '{}'
);
localStorage.setItem(
'userSettings',
JSON.stringify({
...savedSettings,
hideAddResourceModal: false,
colorPrimary: undefined
})
);
} catch (error) {
console.log('Error clearing user settings:', error);
}
};
export const resetStorageUserSettings = () => {
try {
localStorage.setItem(
'userSettings',
JSON.stringify({
...defaultSettings,
colorPrimary: undefined
})
);
} catch (error) {
console.log('Error clearing user settings:', error);
}
};
export const clearAtomStorage = (atom: any) => { export const clearAtomStorage = (atom: any) => {
if (!atom) { if (!atom) {
return; return;
-72
View File
@@ -1,72 +0,0 @@
.alert-info-block {
padding-block: 6px;
padding-inline: 10px 16px;
position: relative;
padding-left: 32px;
text-align: left;
border-radius: var(--border-radius-base);
margin: 0;
border: 1px solid transparent;
.ant-typography {
margin-bottom: 0;
}
&.danger {
border-color: var(--ant-color-error-border);
background-color: var(--ant-color-error-bg);
}
&.warning {
border-color: var(--ant-color-warning-border);
background-color: var(--ant-color-warning-bg);
}
&.transition {
color: var(--ant-geekblue-7);
background: var(--ant-geekblue-1);
border-color: var(--ant-geekblue-3);
}
&.success {
border: 1px solid var(--ant-color-success);
color: var(--ant-color-success);
background: var(--ant-color-success-bg);
.content.success {
font-weight: var(--font-weight-normal);
}
}
.title {
position: absolute;
left: 0;
top: 0;
display: flex;
height: 32px;
padding: 5px 10px;
border-radius: var(--border-radius-base) var(--border-radius-base) 0 0;
.info-icon {
&.danger {
color: var(--ant-color-error);
}
&.warning {
color: var(--ant-color-warning);
}
&.transition {
color: var(--ant-geekblue-7);
}
&.success {
color: var(--ant-color-success);
}
}
.text {
font-weight: var(--font-weight-bold);
}
}
}
+95 -5
View File
@@ -1,10 +1,14 @@
import { WarningFilled } from '@ant-design/icons'; import {
CheckCircleFilled,
LoadingOutlined,
WarningFilled
} from '@ant-design/icons';
import { Typography } from 'antd'; import { Typography } from 'antd';
import { createStyles } from 'antd-style';
import classNames from 'classnames'; import classNames from 'classnames';
import React from 'react'; import React from 'react';
import styled from 'styled-components'; import styled from 'styled-components';
import OverlayScroller, { OverlayScrollerOptions } from '../overlay-scroller'; import OverlayScroller, { OverlayScrollerOptions } from '../overlay-scroller';
import './block.less';
interface AlertInfoProps { interface AlertInfoProps {
type: Global.MessageType; type: Global.MessageType;
message: React.ReactNode; message: React.ReactNode;
@@ -18,6 +22,81 @@ interface AlertInfoProps {
overlayScrollerProps?: OverlayScrollerOptions; overlayScrollerProps?: OverlayScrollerOptions;
} }
const useStyles = createStyles(({ token, css }) => {
return {
alertBlockInfo: css`
padding-block: 6px;
padding-inline: 10px 16px;
position: relative;
padding-left: 32px;
text-align: left;
border-radius: ${token.borderRadius}px;
margin: 0;
border: 1px solid transparent;
.ant-typography {
margin-bottom: 0;
}
&.danger {
border-color: ${token.colorErrorBorder};
background-color: ${token.colorErrorBg};
}
&.warning {
border-color: ${token.colorWarningBorder};
background-color: ${token.colorWarningBg};
}
&.transition {
color: ${token.geekblue7};
background: ${token.geekblue1};
border-color: ${token.geekblue3};
}
&.success {
border: 1px solid ${token.colorSuccess};
color: ${token.colorSuccessText};
background: ${token.colorSuccessBg};
.content.success {
font-weight: var(--font-weight-normal);
}
}
.title {
position: absolute;
left: 0;
top: 0;
display: flex;
height: 32px;
padding: 5px 10px;
border-radius: ${token.borderRadius}px ${token.borderRadius}px 0 0;
.info-icon {
&.danger {
color: ${token.colorErrorText};
}
&.warning {
color: ${token.colorWarningText};
}
&.transition {
color: ${token.geekblue7};
}
&.success {
color: ${token.colorSuccessText};
}
}
.text {
font-weight: var(--font-weight-bold);
}
}
`
};
});
const TitleWrapper = styled.div` const TitleWrapper = styled.div`
font-weight: 700; font-weight: 700;
color: var(--ant-color-text); color: var(--ant-color-text);
@@ -46,12 +125,23 @@ const AlertInfo: React.FC<AlertInfoProps> = (props) => {
maxHeight = 86, maxHeight = 86,
overlayScrollerProps = {} overlayScrollerProps = {}
} = props; } = props;
const { styles } = useStyles();
const renderIcon = () => {
if (type === 'transition') {
return <LoadingOutlined />;
}
if (type === 'success') {
return <CheckCircleFilled />;
}
return <WarningFilled />;
};
return ( return (
<> <>
{message ? ( {message ? (
<div <div
className={classNames('alert-info-block', type)} className={classNames(styles.alertBlockInfo, type)}
style={{ ...style }} style={{ ...style }}
> >
<Typography.Paragraph <Typography.Paragraph
@@ -64,7 +154,7 @@ const AlertInfo: React.FC<AlertInfoProps> = (props) => {
> >
<div className={classNames('title', type)}> <div className={classNames('title', type)}>
<span className={classNames('info-icon', type)}> <span className={classNames('info-icon', type)}>
{icon ?? <WarningFilled />} {icon ?? renderIcon()}
</span> </span>
</div> </div>
{title && ( {title && (
@@ -89,4 +179,4 @@ const AlertInfo: React.FC<AlertInfoProps> = (props) => {
); );
}; };
export default React.memo(AlertInfo); export default AlertInfo;
+2
View File
@@ -28,6 +28,8 @@ const AlertInfo: React.FC<AlertInfoProps> = (props) => {
} }
} }
style={{ style={{
fontWeight: 400,
whiteSpace: 'pre-line',
textAlign: 'center', textAlign: 'center',
padding: '2px 5px', padding: '2px 5px',
borderRadius: 'var(--border-radius-base)', borderRadius: 'var(--border-radius-base)',
-1
View File
@@ -23,7 +23,6 @@
margin-inline: 30px; margin-inline: 30px;
height: 22px; height: 22px;
width: 22px; width: 22px;
overflow: hidden;
.ant-btn { .ant-btn {
height: 22px; height: 22px;
+4 -3
View File
@@ -70,8 +70,9 @@ const AutoImage: React.FC<
setIsError(false); setIsError(false);
}, [props.onLoad]); }, [props.onLoad]);
const handleOnError = useCallback(() => { const handleOnError = useCallback((e: any) => {
setIsError(true); setIsError(true);
e.target.src = fallbackImg;
}, []); }, []);
useEffect(() => { useEffect(() => {
@@ -95,7 +96,7 @@ const AutoImage: React.FC<
preview && preview &&
!isError && { !isError && {
mask: <EyeOutlined />, mask: <EyeOutlined />,
toolbarRender: ( actionsRender: (
_, _,
{ {
transform: { scale }, transform: { scale },
@@ -127,4 +128,4 @@ const AutoImage: React.FC<
); );
}; };
export default React.memo(AutoImage); export default AutoImage;
+2 -2
View File
@@ -59,8 +59,8 @@
.del { .del {
position: absolute; position: absolute;
top: -4px; top: 2px;
right: -2px; right: 2px;
font-size: var(--font-size-middle); font-size: var(--font-size-middle);
cursor: pointer; cursor: pointer;
background-color: var(--color-white-1); background-color: var(--color-white-1);
+23 -14
View File
@@ -1,5 +1,5 @@
import { CloseCircleOutlined } from '@ant-design/icons'; import { CloseCircleOutlined, LoadingOutlined } from '@ant-design/icons';
import { Progress, ProgressProps } from 'antd'; import { Progress, ProgressProps, Spin } from 'antd';
import classNames from 'classnames'; import classNames from 'classnames';
import { round } from 'lodash'; import { round } from 'lodash';
import ResizeObserver from 'rc-resize-observer'; import ResizeObserver from 'rc-resize-observer';
@@ -32,7 +32,7 @@ interface SingleImageProps {
const SingleImage: React.FC<SingleImageProps> = (props) => { const SingleImage: React.FC<SingleImageProps> = (props) => {
const { const {
editable, editable,
onDelete: handleOnDelete, onDelete,
onClick, onClick,
autoSize, autoSize,
uid, uid,
@@ -94,6 +94,22 @@ const SingleImage: React.FC<SingleImageProps> = (props) => {
const handleOnLoad = React.useCallback(async () => {}, []); const handleOnLoad = React.useCallback(async () => {}, []);
const handleOnDelete = (uid: number, e: any) => {
e.stopPropagation();
onDelete(uid);
};
const renderProgress = () => {
<Progress
percent={round(progress, 0)}
type="dashboard"
size={loadingSize}
steps={{ count: 50, gap: 2 }}
format={() => <span className="font-size-20">{round(progress, 0)}%</span>}
railColor="var(--ant-color-fill-secondary)"
/>;
};
return ( return (
<ResizeObserver onResize={handleResize}> <ResizeObserver onResize={handleResize}>
<div <div
@@ -135,15 +151,8 @@ const SingleImage: React.FC<SingleImageProps> = (props) => {
overflow: 'hidden' overflow: 'hidden'
}} }}
> >
<Progress <Spin
percent={round(progress, 0)} indicator={<LoadingOutlined style={{ fontSize: 32 }} spin />}
type="dashboard"
size={loadingSize}
steps={{ count: 50, gap: 2 }}
format={() => (
<span className="font-size-20">{round(progress, 0)}%</span>
)}
trailColor="var(--ant-color-fill-secondary)"
/> />
</span> </span>
) : ( ) : (
@@ -177,7 +186,7 @@ const SingleImage: React.FC<SingleImageProps> = (props) => {
</span> </span>
)} )}
strokeColor="var(--color-white-secondary)" strokeColor="var(--color-white-secondary)"
trailColor="var(--ant-color-fill-secondary)" railColor="var(--ant-color-fill-secondary)"
/> />
</span> </span>
)} )}
@@ -186,7 +195,7 @@ const SingleImage: React.FC<SingleImageProps> = (props) => {
</> </>
{editable && ( {editable && (
<span className="del" onClick={() => handleOnDelete(uid)}> <span className="del" onClick={(e) => handleOnDelete(uid, e)}>
<CloseCircleOutlined /> <CloseCircleOutlined />
</span> </span>
)} )}
+6 -4
View File
@@ -29,6 +29,7 @@ interface AutoTooltipProps extends Omit<TagProps, 'title'> {
} }
const StyledTag = styled(Tag)` const StyledTag = styled(Tag)`
margin: 0;
&.tag-filled { &.tag-filled {
border: none; border: none;
background-color: var(--ant-color-fill-secondary); background-color: var(--ant-color-fill-secondary);
@@ -106,7 +107,7 @@ const AutoTooltip: React.FC<AutoTooltipProps> = ({
<TooltipOverlayScroller <TooltipOverlayScroller
toolTipProps={{ toolTipProps={{
...tooltipProps, ...tooltipProps,
destroyTooltipOnHide: false destroyOnHidden: false
}} }}
title={isOverflowing || showTitle ? title || children : false} title={isOverflowing || showTitle ? title || children : false}
> >
@@ -117,12 +118,13 @@ const AutoTooltip: React.FC<AutoTooltipProps> = ({
) : ( ) : (
<StyledTag <StyledTag
{...tagProps} {...tagProps}
variant="outlined"
className={`${tagProps.className || ''} ${filled ? 'tag-filled' : ''}`} className={`${tagProps.className || ''} ${filled ? 'tag-filled' : ''}`}
ref={contentRef} ref={contentRef}
style={{ style={{
...tagStyle,
paddingInline: tagProps.closable ? '8px 22px' : 8, paddingInline: tagProps.closable ? '8px 22px' : 8,
borderRadius: radius borderRadius: radius,
...tagStyle
}} }}
closeIcon={ closeIcon={
tagProps.closable ? ( tagProps.closable ? (
@@ -146,4 +148,4 @@ const AutoTooltip: React.FC<AutoTooltipProps> = ({
); );
}; };
export default React.memo(AutoTooltip); export default AutoTooltip;
-7
View File
@@ -1,7 +0,0 @@
.cardWrapper {
border-radius: var(--border-radius-small);
background-color: var(--color-white-1);
box-shadow: none;
padding: 10px;
border: 1px solid var(--ant-color-border);
}
+10 -6
View File
@@ -1,12 +1,16 @@
import styles from './index.less'; import styled from 'styled-components';
const Wrapper = styled.div`
border-radius: var(--border-radius-small);
background-color: var(--ant-color-bg-container);
box-shadow: none;
padding: 10px 16px;
border: 1px solid var(--ant-color-border);
`;
const CardWrapper = (props: any) => { const CardWrapper = (props: any) => {
const { children, style } = props; const { children, style } = props;
return ( return <Wrapper style={{ ...style }}>{children}</Wrapper>;
<div className={styles.cardWrapper} style={{ ...style }}>
{children}
</div>
);
}; };
export default CardWrapper; export default CardWrapper;
@@ -0,0 +1,57 @@
import React, { useEffect, useRef, useState } from 'react';
interface CollapseProps {
open: boolean;
children: React.ReactNode;
duration?: number;
minHeight?: number;
}
export default function Collapse({
open,
children,
minHeight = 0,
duration = 200
}: CollapseProps) {
const ref = useRef<HTMLDivElement>(null);
const [height, setHeight] = useState<number | 'auto'>(minHeight);
useEffect(() => {
const el = ref.current;
if (!el) return;
if (open) {
const h = el.scrollHeight;
setHeight(h);
const timer = setTimeout(() => {
setHeight('auto');
}, duration);
return () => clearTimeout(timer);
} else {
const h = el.scrollHeight;
setHeight(h);
requestAnimationFrame(() => {
requestAnimationFrame(() => {
setHeight(0);
});
});
}
return undefined;
}, [open, duration]);
return (
<div
ref={ref}
style={{
height,
overflow: 'hidden',
transition: `height ${duration}ms ease`
}}
>
{children}
</div>
);
}
+219
View File
@@ -0,0 +1,219 @@
import IconFont from '@/components/icon-font';
import { Card } from 'antd';
import { createStyles } from 'antd-style';
import classNames from 'classnames';
import React, { useEffect, useRef, useState } from 'react';
import styled from 'styled-components';
const CardStyled = styled(Card)`
box-shadow: none !important;
background-color: none;
&.isOpen {
.ant-card-head {
border-bottom: 1px solid var(--ant-color-border-secondary);
border-radius: var(--ant-border-radius) var(--ant-border-radius) 0 0;
}
}
.ant-card-head {
cursor: pointer;
background-color: var(--ant-color-fill-quaternary);
border-bottom: none;
border-radius: var(--ant-border-radius);
padding: 0 16px;
&:hover {
background-color: var(--ant-color-fill-secondary);
.del-btn {
display: block;
}
}
}
&.disabled {
.ant-card-head {
cursor: not-allowed;
background-color: var(--ant-color-fill-quaternary) !important;
}
}
`;
const useStyles = createStyles(({ css, token }) => {
return {
title: css`
font-weight: 400;
min-height: 56px;
font-size: var(--font-size-base);
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
`,
expandIcon: css`
display: flex;
align-items: center;
gap: 8px;
`,
subtitle: css`
font-size: 14px;
color: ${token.colorTextSecondary};
`,
content: css`
padding-top: 8px;
`,
left: css`
flex: 1;
`,
right: css`
display: flex;
align-items: center;
gap: 8px;
.del-btn {
display: none;
}
`
};
});
export interface CollapsibleContainerProps {
title?: React.ReactNode;
subtitle?: React.ReactNode;
right?: React.ReactNode;
deleteBtn?: React.ReactNode;
defaultOpen?: boolean;
open?: boolean;
collapsible?: boolean;
showExpandIcon?: boolean;
onToggle?: (open: boolean) => void;
disabled?: boolean;
variant?: 'outlined' | 'borderless' | undefined;
iconPlacement?: 'left' | 'right';
className?: string;
children?: React.ReactNode;
styles?: {
root?: React.CSSProperties;
body?: React.CSSProperties;
header?: React.CSSProperties;
content?: React.CSSProperties;
};
}
export default function CollapsibleContainer({
title,
subtitle,
right,
deleteBtn,
defaultOpen = true,
open,
onToggle,
disabled = false,
showExpandIcon = true,
variant = 'borderless',
className = '',
collapsible,
iconPlacement = 'left',
styles: cardStyles,
children
}: CollapsibleContainerProps) {
const { styles } = useStyles();
const isControlled = typeof open === 'boolean';
const [internalOpen, setInternalOpen] = useState(defaultOpen);
const isOpen = collapsible
? isControlled
? (open as boolean)
: internalOpen
: true;
const toggle = () => {
if (disabled || !collapsible) return;
const next = !isOpen;
if (!isControlled) setInternalOpen(next);
onToggle?.(next);
};
const contentRef = useRef<HTMLDivElement>(null);
const [height, setHeight] = useState(isOpen ? 'auto' : '0px');
const renderIcon = () => {
if (showExpandIcon) {
return (
<IconFont
rotate={isOpen ? 180 : 0}
type="icon-down"
style={{
cursor: disabled ? 'not-allowed' : 'pointer',
fontSize: 12
}}
/>
);
}
return null;
};
const renderTitle = () => {
if (!collapsible) {
return null;
}
return (
<div className={styles.title} onClick={toggle}>
<div className={styles.left}>
<div className={styles.expandIcon}>
{iconPlacement === 'left' && renderIcon()}
{title && <div>{title}</div>}
</div>
{subtitle && <div className={styles.subtitle}>{subtitle}</div>}
</div>
<div className={styles.right}>
{right && <span>{right}</span>}
{deleteBtn && <span className="del-btn">{deleteBtn}</span>}
{iconPlacement === 'right' && renderIcon()}
</div>
</div>
);
};
useEffect(() => {
if (!collapsible) {
setHeight('auto');
return;
}
if (isOpen) {
const scrollHeight = contentRef.current?.scrollHeight || 0;
setHeight(scrollHeight + 'px');
const timer = setTimeout(() => setHeight('auto'), 200);
return () => clearTimeout(timer);
} else {
const scrollHeight = contentRef.current?.scrollHeight || 0;
setHeight(scrollHeight + 'px');
requestAnimationFrame(() => setHeight('0px'));
return () => {};
}
}, [isOpen, collapsible]);
return (
<CardStyled
className={classNames(className, { collapsible, disabled, isOpen })}
variant={variant}
styles={{
root: {
...cardStyles?.root
},
body: {
padding: 0,
...cardStyles?.body
},
header: {
...cardStyles?.header
}
}}
title={renderTitle()}
>
<div
ref={contentRef}
style={{
height: height,
overflow: 'hidden'
}}
>
<div style={{ paddingTop: 8, ...cardStyles?.content }}>{children}</div>
</div>
</CardStyled>
);
}
+99 -50
View File
@@ -1,13 +1,12 @@
import { CheckCircleFilled, CopyOutlined } from '@ant-design/icons'; import { CheckCircleFilled, CopyOutlined } from '@ant-design/icons';
import { useIntl } from '@umijs/max'; import { useIntl } from '@umijs/max';
import { Button, Tooltip, message } from 'antd'; import { Button, message, Tooltip } from 'antd';
import ClipboardJS from 'clipboard';
import React, { useEffect, useMemo, useRef, useState } from 'react'; import React, { useEffect, useMemo, useRef, useState } from 'react';
import AutoTooltip from '../auto-tooltip';
type CopyButtonProps = { type CopyButtonProps = {
children?: React.ReactNode; children?: React.ReactNode;
text: string; text: string;
disabled?: boolean;
fontSize?: string; fontSize?: string;
type?: 'text' | 'primary' | 'dashed' | 'link' | 'default'; type?: 'text' | 'primary' | 'dashed' | 'link' | 'default';
size?: 'small' | 'middle' | 'large'; size?: 'small' | 'middle' | 'large';
@@ -30,36 +29,81 @@ const CopyButton: React.FC<CopyButtonProps> = ({
children, children,
tips, tips,
text, text,
disabled,
type = 'text', type = 'text',
shape = 'default', shape = 'default',
fontSize = '14px', fontSize = '14px',
style, style,
btnStyle, btnStyle,
placement, placement,
size = 'middle' size = 'small'
}) => { }) => {
const intl = useIntl(); const intl = useIntl();
const [copied, setCopied] = useState(false); const [copied, setCopied] = useState(false);
const buttonRef = useRef(null); const timerRef = useRef<number>();
const clipboardRef = useRef<any>(null);
const initClipboard = () => { const resetCopied = () => {
if (buttonRef.current) { window.clearTimeout(timerRef.current);
clipboardRef.current = new ClipboardJS(buttonRef.current); timerRef.current = window.setTimeout(() => {
clipboardRef.current.on('success', () => { setCopied(false);
}, 3000);
};
/**
* Modern clipboard API (works in secure contexts: HTTPS or localhost)
*/
const asyncCopy = async (value: string): Promise<boolean> => {
try {
await navigator.clipboard.writeText(value);
return true;
} catch (error) {
return false;
}
};
/**
* Fallback: execCommand with copy event listener
* More reliable than textarea selection method
*/
const execCopy = (value: string): boolean => {
let copySuccess = false;
const onCopy = (event: ClipboardEvent) => {
event.stopPropagation();
event.preventDefault();
event.clipboardData?.clearData();
event.clipboardData?.setData('text/plain', value);
copySuccess = true;
};
try {
document.addEventListener('copy', onCopy, { capture: true });
document.execCommand('copy');
return copySuccess;
} catch (error) {
return false;
} finally {
document.removeEventListener('copy', onCopy, { capture: true });
}
};
const handleCopy = async () => {
try {
// Try modern clipboard API first
if (await asyncCopy(text)) {
setCopied(true); setCopied(true);
setTimeout(() => { return;
setCopied(false); }
}, 3000);
});
clipboardRef.current.on('error', (e: any) => { // Fallback to execCommand method
message.success( if (execCopy(text)) {
intl.formatMessage({ id: 'common.copy.fail' }) as string setCopied(true);
); return;
e.clearSelection(); }
});
// Both methods failed
throw new Error('Copy failed');
} catch (error) {
message.error(intl.formatMessage({ id: 'common.copy.fail' }) as string);
} }
}; };
@@ -68,39 +112,44 @@ const CopyButton: React.FC<CopyButtonProps> = ({
return intl.formatMessage({ id: 'common.button.copied' }); return intl.formatMessage({ id: 'common.button.copied' });
} }
return tips ?? intl.formatMessage({ id: 'common.button.copy' }); return tips ?? intl.formatMessage({ id: 'common.button.copy' });
}, [copied, intl, tips]); }, [copied, tips, intl]);
useEffect(() => { useEffect(() => {
initClipboard(); resetCopied();
return () => { }, [copied]);
clipboardRef.current?.destroy();
};
}, [buttonRef]);
return ( return (
<Tooltip title={tipTitle} placement={placement}> <div className="flex-center gap-4" style={{ minWidth: 16 }}>
<Button {children && (
className="copy-button" <AutoTooltip minWidth={20} ghost>
ref={buttonRef} {children}
type={type} </AutoTooltip>
shape={shape} )}
size={size} <Tooltip title={tipTitle} placement={placement}>
disabled={!!disabled} <span>
data-clipboard-text={text} <Button
style={{ ...btnStyle }} className="copy-button"
icon={ type={type}
copied ? ( shape={shape}
<CheckCircleFilled size={size}
style={{ color: 'var(--ant-color-success)', fontSize: fontSize }} onClick={handleCopy}
/> style={{ ...btnStyle }}
) : ( icon={
<CopyOutlined style={{ fontSize: fontSize, ...style }} /> copied ? (
) <CheckCircleFilled
} style={{
> color: 'var(--ant-color-success)',
{children} fontSize
</Button> }}
</Tooltip> />
) : (
<CopyOutlined style={{ fontSize, ...style }} />
)
}
></Button>
</span>
</Tooltip>
</div>
); );
}; };
+3 -3
View File
@@ -15,7 +15,7 @@ const fadeOut = keyframes`
} }
`; `;
const Mask = styled.div<{ isHiding: boolean }>` const Mask = styled.div<{ $isHiding: boolean }>`
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@@ -26,7 +26,7 @@ const Mask = styled.div<{ isHiding: boolean }>`
height: 100vh; height: 100vh;
background-color: rgba(59, 59, 59, 1); background-color: rgba(59, 59, 59, 1);
z-index: 9999; z-index: 9999;
animation: ${({ isHiding }) => (isHiding ? fadeOut : 'none')} ${duration}s animation: ${({ $isHiding }) => ($isHiding ? fadeOut : 'none')} ${duration}s
ease forwards; ease forwards;
`; `;
@@ -79,7 +79,7 @@ const DarkModeMask = () => {
return () => el.removeEventListener('animationend', handleAnimationEnd); return () => el.removeEventListener('animationend', handleAnimationEnd);
}, [visible]); }, [visible]);
return visible ? <Mask ref={maskRef} isHiding={isHiding}></Mask> : null; return visible ? <Mask ref={maskRef} $isHiding={isHiding}></Mask> : null;
}; };
export default DarkModeMask; export default DarkModeMask;
+12 -2
View File
@@ -72,6 +72,7 @@ interface Configuration {
checked: boolean; checked: boolean;
} }
// default need to pass content and operation
const DeleteModal = forwardRef((props, ref) => { const DeleteModal = forwardRef((props, ref) => {
const intl = useIntl(); const intl = useIntl();
const { styles } = useStyles(); const { styles } = useStyles();
@@ -80,6 +81,7 @@ const DeleteModal = forwardRef((props, ref) => {
const [configuration, setConfiguration] = useState<Configuration>({ const [configuration, setConfiguration] = useState<Configuration>({
checked: false checked: false
}); });
const [delLoading, setDelLoading] = useState(false);
const [config, setConfig] = useState<ModalFuncProps & DataOptions>({} as any); const [config, setConfig] = useState<ModalFuncProps & DataOptions>({} as any);
const show = (data: ModalFuncProps & DataOptions) => { const show = (data: ModalFuncProps & DataOptions) => {
@@ -104,6 +106,7 @@ const DeleteModal = forwardRef((props, ref) => {
const handleOk = async () => { const handleOk = async () => {
try { try {
setDelLoading(true);
const res = await config.onOk?.(); const res = await config.onOk?.();
const isArray = Array.isArray(res); const isArray = Array.isArray(res);
if (isArray) { if (isArray) {
@@ -120,6 +123,7 @@ const DeleteModal = forwardRef((props, ref) => {
// Handle error if needed // Handle error if needed
} finally { } finally {
setVisible(false); setVisible(false);
setDelLoading(false);
restoreScrollHeight(); restoreScrollHeight();
} }
}; };
@@ -138,7 +142,7 @@ const DeleteModal = forwardRef((props, ref) => {
open={visible} open={visible}
onOk={handleOk} onOk={handleOk}
onCancel={handleCancel} onCancel={handleCancel}
destroyOnClose={false} destroyOnHidden={false}
closeIcon={false} closeIcon={false}
maskClosable={false} maskClosable={false}
keyboard={false} keyboard={false}
@@ -155,7 +159,13 @@ const DeleteModal = forwardRef((props, ref) => {
? intl.formatMessage({ id: config.cancelText }) ? intl.formatMessage({ id: config.cancelText })
: intl.formatMessage({ id: 'common.button.cancel' })} : intl.formatMessage({ id: 'common.button.cancel' })}
</Button> </Button>
<Button type="primary" onClick={handleOk} size="middle"> <Button
type="primary"
onClick={handleOk}
size="middle"
danger
loading={delLoading}
>
{config.okText {config.okText
? intl.formatMessage({ id: config.okText }) ? intl.formatMessage({ id: config.okText })
: intl.formatMessage({ id: 'common.button.delete' })} : intl.formatMessage({ id: 'common.button.delete' })}
@@ -16,6 +16,9 @@ const DropDownActions: React.FC<DropDownProps> = (props) => {
const items = useMemo(() => { const items = useMemo(() => {
return menu?.items?.map((item: any) => ({ return menu?.items?.map((item: any) => ({
..._.omit(item, 'locale'), ..._.omit(item, 'locale'),
icon: item.icon
? React.cloneElement(item.icon, { style: { fontSize: 14 } })
: null,
label: item.locale ? intl.formatMessage({ id: item.label }) : item.label label: item.locale ? intl.formatMessage({ id: item.label }) : item.label
})); }));
}, [menu?.items, intl]); }, [menu?.items, intl]);
+68 -65
View File
@@ -1,9 +1,10 @@
import { MoreOutlined } from '@ant-design/icons'; import { MoreOutlined } from '@ant-design/icons';
import { useIntl } from '@umijs/max'; import { useIntl } from '@umijs/max';
import { Button, Dropdown, Tooltip, type MenuProps } from 'antd'; import { Button, Dropdown, Space, Tooltip, type MenuProps } from 'antd';
import classNames from 'classnames'; import classNames from 'classnames';
import _ from 'lodash'; import _ from 'lodash';
import React from 'react'; import React from 'react';
import styled from 'styled-components';
import './index.less'; import './index.less';
type Trigger = 'click' | 'hover'; type Trigger = 'click' | 'hover';
@@ -19,7 +20,20 @@ interface DropdownButtonsProps {
onSelect: (val: any, item?: any) => void; onSelect: (val: any, item?: any) => void;
} }
const DropdownButtons: React.FC<DropdownButtonsProps> = ({ const DropdownWrapper = styled.div`
display: flex;
flex-direction: column;
background-color: var(--ant-color-bg-elevated);
padding: 5px;
align-items: flex-start;
border-radius: var(--border-radius-base);
box-shadow: var(--ant-box-shadow-secondary);
min-width: 160px;
`;
const DropdownButtons: React.FC<
DropdownButtonsProps & { items: MenuProps['items'] }
> = ({
items, items,
size = 'middle', size = 'middle',
trigger = ['hover'], trigger = ['hover'],
@@ -60,75 +74,64 @@ const DropdownButtons: React.FC<DropdownButtonsProps> = ({
></Button> ></Button>
</Tooltip> </Tooltip>
) : ( ) : (
<Dropdown.Button <Space.Compact>
disabled={disabled} <>
trigger={trigger} {showText ? (
type="primary" <Button
dropdownRender={(menus: any) => { {...headItem?.props}
return ( disabled={headItem?.disabled || disabled}
<div className={classNames('dropdown-button', size)}
className="flex flex-column " onClick={handleButtonClick}
style={{ size={size}
backgroundColor: 'var(--ant-color-bg-elevated)', icon={headItem?.icon}
padding: 5, variant={variant}
alignItems: 'flex-start', color={color}
borderRadius: 'var(--border-radius-base)',
boxShadow: 'var(--ant-box-shadow-secondary)'
}}
> >
{_.map(_.tail(items), (item: any) => { {intl.formatMessage({
return ( id: headItem?.label
<Button
{...item.props}
type="text"
size={size}
icon={item.icon}
key={item.key}
disabled={item.disabled}
onClick={() => handleMenuClick(item)}
style={{ width: '100%', justifyContent: 'flex-start' }}
>
{intl.formatMessage({ id: item.label })}
</Button>
);
})} })}
</div> {extra}
); </Button>
}} ) : (
buttonsRender={([leftButton, rightButton]) => [ <Tooltip
<> title={intl.formatMessage({ id: headItem?.label })}
{showText ? ( key="leftButton"
>
<Button <Button
{...headItem?.props} {...headItem?.props}
disabled={headItem?.disabled || disabled}
className={classNames('dropdown-button', size)} className={classNames('dropdown-button', size)}
onClick={handleButtonClick} onClick={handleButtonClick}
size={size} size={size}
icon={headItem?.icon} icon={headItem?.icon}
variant={variant} disabled={headItem?.disabled}
color={color} ></Button>
> </Tooltip>
{intl.formatMessage({ )}
id: headItem?.label </>
})} <Dropdown
{extra} disabled={disabled}
</Button> trigger={trigger}
) : ( placement="bottomRight"
<Tooltip styles={{
title={intl.formatMessage({ id: headItem?.label })} root: {
key="leftButton" minWidth: 160
> },
<Button itemIcon: {
{...headItem?.props} fontSize: 14
className={classNames('dropdown-button', size)} }
onClick={handleButtonClick} }}
size={size} menu={{
icon={headItem?.icon} onClick: handleMenuClick,
disabled={headItem?.disabled} items: _.tail(items).map((item: any) => ({
></Button> ...item,
</Tooltip> ...item.props,
)} label:
</>, item.locale || item.locale === undefined
? intl.formatMessage({ id: item.label })
: item.label
}))
}}
>
<Button <Button
icon={<MoreOutlined />} icon={<MoreOutlined />}
size={size} size={size}
@@ -137,8 +140,8 @@ const DropdownButtons: React.FC<DropdownButtonsProps> = ({
color="default" color="default"
className={classNames('dropdown-button', size)} className={classNames('dropdown-button', size)}
></Button> ></Button>
]} </Dropdown>
></Dropdown.Button> </Space.Compact>
)} )}
</> </>
); );
@@ -0,0 +1,19 @@
import ComponentsMap from '@/components/seal-form/config/components';
import { SealFormItemProps } from '@/components/seal-form/types';
import { Form } from 'antd';
import React from 'react';
interface FieldItemProps extends SealFormItemProps {
widget: keyof typeof ComponentsMap;
name: string;
}
const FieldItem: React.FC<FieldItemProps> = (props) => {
const { name, widget, required = [], ...rest } = props;
const Component = ComponentsMap[widget];
return <Form.Item name={name}></Form.Item>;
};
export default FieldItem;
@@ -0,0 +1,59 @@
import ComponentsMap from '@/components/seal-form/config/components';
import { FormWidgetProps } from '../config/types';
const FormWidget: React.FC<
FormWidgetProps & {
onChange?: (data: any) => void;
disabled?: boolean;
}
> = ({
widget,
title: label,
required,
placeholder,
options,
description,
enum: enumValues,
style,
value,
min,
max,
status,
checked,
isInFormItems,
disabled,
onChange
}) => {
const Component = ComponentsMap[widget];
const optionList = enumValues?.map((item: string | number) => ({
label: item,
value: item
}));
return Component ? (
<Component
{...{
label,
required,
placeholder,
description,
min,
max
}}
status={status}
isInFormItems={isInFormItems}
disabled={disabled}
options={options || optionList}
value={value}
checked={checked}
style={{
width: '100%',
...style
}}
onChange={onChange}
/>
) : null;
};
export default FormWidget;
@@ -0,0 +1,175 @@
import Wrapper from '@/components/label-selector/wrapper';
import { MinusOutlined } from '@ant-design/icons';
import { Button } from 'antd';
import React, { useEffect, useMemo } from 'react';
import styled from 'styled-components';
import { statusType } from '../config/types';
import FormWidget from './form-widget';
const RowWrapper = styled.div`
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
`;
const WidgetBox = styled.div`
display: flex;
align-items: center;
gap: 8px;
width: 100%;
`;
interface ListMapProps {
minItems?: number;
dataList: any[];
label?: React.ReactNode;
btnText?: string;
requiredFields?: string[];
validateStatusList?: Record<string, statusType>[];
properties: Record<string, any>;
disabled?: boolean;
onAdd?: (data: any[]) => void;
onDelete?: (deletedItem: any, data: any[]) => void;
onChange?: (data: any) => void;
}
interface ListItemProps {
schemaList: any[];
data: Record<string, any>;
disabled?: boolean;
validateStatus?: Record<string, statusType>;
onChange?: (data: any) => void;
}
const ListItem: React.FC<ListItemProps> = ({
schemaList,
data,
onChange,
validateStatus,
disabled
}) => {
const handleValueChange = (name: string, target: any) => {
if (target?.target?.type === 'checkbox') {
const checked = target.target?.checked;
onChange?.({ [name]: checked });
} else {
const value = target?.target ? target.target.value : target;
onChange?.({ [name]: value });
}
};
return (
<>
{schemaList.map((schema: any) => (
<FormWidget
status={validateStatus?.[schema.name]}
widget={schema.type}
{...schema}
disabled={disabled || schema.readOnly}
key={schema.name}
value={data?.[schema.name]}
checked={data?.[schema.name]}
isInFormItems={false}
onChange={(target) => handleValueChange(schema.name, target)}
/>
))}
</>
);
};
const ListMap: React.FC<ListMapProps> = ({
dataList = [],
label,
btnText,
properties = {},
requiredFields = [],
minItems = 0,
validateStatusList = [],
disabled,
onAdd,
onDelete,
onChange
}) => {
const [items, setItems] = React.useState(dataList || []);
const schemaList = useMemo(() => {
const list = Object.entries(properties).map(([key, value]) => ({
...value,
required: requiredFields.includes(key),
name: key
}));
return list;
}, [properties, requiredFields]);
const handleOnAdd = () => {
const keys = Object.keys(properties);
const newItems = [
...items,
{ ...keys.reduce((acc, key) => ({ ...acc, [key]: '' }), {}) }
];
setItems(newItems);
onAdd?.(newItems);
};
const handleDelete = (index: number) => {
const deleteItem = items[index];
const newItems = items.filter((_, i) => i !== index);
setItems(newItems);
onDelete?.(deleteItem, newItems);
};
const handleItemChange = (index: number, data: { [key: string]: any }) => {
const newItems = [...items];
newItems[index] = { ...newItems[index], ...data };
setItems(newItems);
onChange?.(newItems);
};
useEffect(() => {
if (!dataList.length && minItems > 0) {
handleOnAdd();
}
}, []);
useEffect(() => {
setItems(dataList);
}, [dataList]);
return (
<Wrapper
label={label}
btnText={btnText}
onAdd={handleOnAdd}
disabled={disabled}
>
{items.map((item, index) => (
<RowWrapper key={index}>
<WidgetBox>
<ListItem
schemaList={schemaList}
data={item}
validateStatus={validateStatusList?.[index]}
disabled={disabled}
onChange={(value) => handleItemChange(index, value)}
/>
</WidgetBox>
{!disabled && (
<Button
size="small"
type="default"
shape="circle"
style={{
width: 24,
marginLeft: 10,
flex: 'none'
}}
icon={<MinusOutlined />}
onClick={() => handleDelete(index)}
/>
)}
</RowWrapper>
))}
</Wrapper>
);
};
export default ListMap;
@@ -0,0 +1,39 @@
import React from 'react';
// refer to json schema
export interface FieldSchema {
type: 'string' | 'number' | 'boolean' | 'object' | 'array';
title?: string;
name: string;
description?: string;
properties?: Record<string, FieldSchema>;
default?: any;
enum?: string[];
minItems?: number;
maxItems?: number;
items?: FieldSchema[];
widget?: string;
min?: number;
style?: React.CSSProperties;
required?: string[];
}
export type statusType = 'error' | 'warning' | '' | undefined;
export interface FormWidgetProps {
status?: statusType;
isInFormItems?: boolean;
widget: 'Input' | 'Select' | 'Checkbox' | 'InputNumber';
name: string;
title?: string;
required?: boolean;
placeholder?: string;
readOnly?: boolean;
options?: { label: string; value: string | number }[];
description?: string;
enum?: (string | number)[];
style?: React.CSSProperties;
value?: any;
checked?: boolean;
min?: number;
max?: number;
}

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