github-actions[bot] commited on
Commit
9c4cea4
·
1 Parent(s): de009e3

Sync from GitHub Viciy2023/Qwen2API-A@e8f8069997ec0ee595b9df2d02a467aa3b590c59

Browse files
Files changed (2) hide show
  1. .gitignore +2 -0
  2. public/src/views/dashboard.vue +92 -6
.gitignore CHANGED
@@ -12,3 +12,5 @@ pkg_dist/
12
  /public/dist
13
  构建日志.MD
14
  运行日志.MD
 
 
 
12
  /public/dist
13
  构建日志.MD
14
  运行日志.MD
15
+ qwen-auto-register/output
16
+ qwen-auto-register
public/src/views/dashboard.vue CHANGED
@@ -410,6 +410,7 @@
410
  <div>
411
  <h3 class="text-lg font-semibold text-slate-800">{{ group.title }}</h3>
412
  <p class="text-xs text-slate-500 mt-1">{{ group.description }}</p>
 
413
  </div>
414
  <span :class="group.badgeClass" class="rounded-full px-3 py-1 text-xs font-semibold">
415
  {{ group.models.length }} 个
@@ -433,6 +434,15 @@
433
  <span class="rounded-full bg-emerald-100 px-2 py-1 text-xs text-emerald-700">
434
  推荐:{{ getModelUseCase(model) }}
435
  </span>
 
 
 
 
 
 
 
 
 
436
  </div>
437
  </div>
438
  </div>
@@ -555,6 +565,60 @@ const createModelGroupMap = (models) => {
555
  return groups
556
  }
557
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
558
  const allModelGroups = computed(() => createModelGroupMap(availableModels.value))
559
  const modelGroups = computed(() => createModelGroupMap(filteredModels.value))
560
 
@@ -572,42 +636,42 @@ const groupedModelSections = computed(() => [
572
  title: '基础模型',
573
  description: '适合普通对话、通用推理和默认场景',
574
  badgeClass: 'bg-slate-100 text-slate-700',
575
- models: activeModelFilter.value === 'all' || activeModelFilter.value === 'base' ? modelGroups.value.base : []
576
  },
577
  {
578
  key: 'thinking',
579
  title: 'Thinking 模型',
580
  description: '带推理输出能力,适合复杂思考场景',
581
  badgeClass: 'bg-amber-100 text-amber-700',
582
- models: activeModelFilter.value === 'all' || activeModelFilter.value === 'thinking' ? modelGroups.value.thinking : []
583
  },
584
  {
585
  key: 'search',
586
  title: 'Search 模型',
587
  description: '带搜索能力,适合联网或检索场景',
588
  badgeClass: 'bg-cyan-100 text-cyan-700',
589
- models: activeModelFilter.value === 'all' || activeModelFilter.value === 'search' ? modelGroups.value.search : []
590
  },
591
  {
592
  key: 'image',
593
  title: 'Image 模型',
594
  description: '适合图片理解或生图相关能力',
595
  badgeClass: 'bg-rose-100 text-rose-700',
596
- models: activeModelFilter.value === 'all' || activeModelFilter.value === 'image' ? modelGroups.value.image : []
597
  },
598
  {
599
  key: 'video',
600
  title: 'Video 模型',
601
  description: '适合视频相关能力或多模态视频处理',
602
  badgeClass: 'bg-indigo-100 text-indigo-700',
603
- models: activeModelFilter.value === 'all' || activeModelFilter.value === 'video' ? modelGroups.value.video : []
604
  },
605
  {
606
  key: 'imageEdit',
607
  title: 'Image Edit 模型',
608
  description: '适合图像编辑与改图类能力',
609
  badgeClass: 'bg-emerald-100 text-emerald-700',
610
- models: activeModelFilter.value === 'all' || activeModelFilter.value === 'imageEdit' ? modelGroups.value.imageEdit : []
611
  }
612
  ])
613
 
@@ -686,6 +750,28 @@ const getModelUseCase = (model) => {
686
  return '通用对话'
687
  }
688
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
689
  const copyModelRequestExample = async (model) => {
690
  const example = {
691
  model: model.id,
 
410
  <div>
411
  <h3 class="text-lg font-semibold text-slate-800">{{ group.title }}</h3>
412
  <p class="text-xs text-slate-500 mt-1">{{ group.description }}</p>
413
+ <p class="mt-2 text-xs text-slate-400">当前分类已按模型强度从高到低排序</p>
414
  </div>
415
  <span :class="group.badgeClass" class="rounded-full px-3 py-1 text-xs font-semibold">
416
  {{ group.models.length }} 个
 
434
  <span class="rounded-full bg-emerald-100 px-2 py-1 text-xs text-emerald-700">
435
  推荐:{{ getModelUseCase(model) }}
436
  </span>
437
+ <div class="relative group/tooltip inline-flex">
438
+ <span class="cursor-help rounded-full bg-amber-100 px-2 py-1 text-xs text-amber-700">
439
+ 强度:{{ getModelPriorityLabel(model, group.key) }}
440
+ </span>
441
+ <div class="pointer-events-none absolute left-0 top-full z-20 mt-2 hidden w-64 rounded-2xl border border-amber-200 bg-white/95 p-3 text-xs text-slate-600 shadow-xl backdrop-blur-sm group-hover/tooltip:block">
442
+ <div class="font-semibold text-amber-700">强度说明</div>
443
+ <div class="mt-2 leading-5 whitespace-pre-line">{{ getModelPriorityTooltip(model, group.key) }}</div>
444
+ </div>
445
+ </div>
446
  </div>
447
  </div>
448
  </div>
 
565
  return groups
566
  }
567
 
568
+ const getModelStrengthScore = (model, groupKey = 'base') => {
569
+ const id = model.id.toLowerCase()
570
+ let score = 0
571
+
572
+ if (id.includes('max')) score += 120
573
+ if (id.includes('plus')) score += 90
574
+ if (id.includes('vl')) score += 82
575
+ if (id.includes('omni')) score += 80
576
+ if (id.includes('coder')) score += 78
577
+ if (id.includes('flash')) score += 50
578
+ if (id.includes('latest')) score += 18
579
+ if (id.includes('thinking')) score += 8
580
+ if (id.includes('search')) score += 6
581
+ if (id.includes('image-edit')) score += 12
582
+ else if (id.includes('image')) score += 10
583
+ if (id.includes('video')) score += 10
584
+
585
+ if (groupKey === 'base') {
586
+ if (id.includes('max')) score += 20
587
+ if (id.includes('flash')) score -= 8
588
+ }
589
+
590
+ if (groupKey === 'thinking') {
591
+ if (id.includes('max')) score += 12
592
+ if (id.includes('plus')) score += 10
593
+ if (id.includes('flash')) score -= 6
594
+ }
595
+
596
+ if (groupKey === 'search') {
597
+ if (id.includes('max')) score += 12
598
+ if (id.includes('plus')) score += 8
599
+ if (id.includes('flash')) score -= 5
600
+ }
601
+
602
+ if (groupKey === 'image' || groupKey === 'imageEdit' || groupKey === 'video') {
603
+ if (id.includes('vl') || id.includes('omni')) score += 14
604
+ if (id.includes('max')) score += 10
605
+ if (id.includes('flash')) score -= 4
606
+ }
607
+
608
+ return score
609
+ }
610
+
611
+ const sortModelsByStrength = (models, groupKey) => {
612
+ return [...models].sort((a, b) => {
613
+ const scoreDiff = getModelStrengthScore(b, groupKey) - getModelStrengthScore(a, groupKey)
614
+ if (scoreDiff !== 0) {
615
+ return scoreDiff
616
+ }
617
+
618
+ return a.id.localeCompare(b.id)
619
+ })
620
+ }
621
+
622
  const allModelGroups = computed(() => createModelGroupMap(availableModels.value))
623
  const modelGroups = computed(() => createModelGroupMap(filteredModels.value))
624
 
 
636
  title: '基础模型',
637
  description: '适合普通对话、通用推理和默认场景',
638
  badgeClass: 'bg-slate-100 text-slate-700',
639
+ models: activeModelFilter.value === 'all' || activeModelFilter.value === 'base' ? sortModelsByStrength(modelGroups.value.base, 'base') : []
640
  },
641
  {
642
  key: 'thinking',
643
  title: 'Thinking 模型',
644
  description: '带推理输出能力,适合复杂思考场景',
645
  badgeClass: 'bg-amber-100 text-amber-700',
646
+ models: activeModelFilter.value === 'all' || activeModelFilter.value === 'thinking' ? sortModelsByStrength(modelGroups.value.thinking, 'thinking') : []
647
  },
648
  {
649
  key: 'search',
650
  title: 'Search 模型',
651
  description: '带搜索能力,适合联网或检索场景',
652
  badgeClass: 'bg-cyan-100 text-cyan-700',
653
+ models: activeModelFilter.value === 'all' || activeModelFilter.value === 'search' ? sortModelsByStrength(modelGroups.value.search, 'search') : []
654
  },
655
  {
656
  key: 'image',
657
  title: 'Image 模型',
658
  description: '适合图片理解或生图相关能力',
659
  badgeClass: 'bg-rose-100 text-rose-700',
660
+ models: activeModelFilter.value === 'all' || activeModelFilter.value === 'image' ? sortModelsByStrength(modelGroups.value.image, 'image') : []
661
  },
662
  {
663
  key: 'video',
664
  title: 'Video 模型',
665
  description: '适合视频相关能力或多模态视频处理',
666
  badgeClass: 'bg-indigo-100 text-indigo-700',
667
+ models: activeModelFilter.value === 'all' || activeModelFilter.value === 'video' ? sortModelsByStrength(modelGroups.value.video, 'video') : []
668
  },
669
  {
670
  key: 'imageEdit',
671
  title: 'Image Edit 模型',
672
  description: '适合图像编辑与改图类能力',
673
  badgeClass: 'bg-emerald-100 text-emerald-700',
674
+ models: activeModelFilter.value === 'all' || activeModelFilter.value === 'imageEdit' ? sortModelsByStrength(modelGroups.value.imageEdit, 'imageEdit') : []
675
  }
676
  ])
677
 
 
750
  return '通用对话'
751
  }
752
 
753
+ const getModelPriorityLabel = (model, groupKey) => {
754
+ const score = getModelStrengthScore(model, groupKey)
755
+
756
+ if (score >= 125) return 'S'
757
+ if (score >= 95) return 'A'
758
+ if (score >= 70) return 'B'
759
+ return 'C'
760
+ }
761
+
762
+ const getModelPriorityTooltip = (model, groupKey) => {
763
+ const level = getModelPriorityLabel(model, groupKey)
764
+ const useCase = getModelUseCase(model)
765
+ const baseText = {
766
+ S: 'S:该分类下的第一梯队,优先推荐使用。',
767
+ A: 'A:该分类下的强势模型,适合大多数正式场景。',
768
+ B: 'B:该分类下的均衡模型,适合常规使用。',
769
+ C: 'C:该分类下的基础可用模型,适合轻量或备用场景。'
770
+ }
771
+
772
+ return `${baseText[level]}\n推荐用途:${useCase}`
773
+ }
774
+
775
  const copyModelRequestExample = async (model) => {
776
  const example = {
777
  model: model.id,