MessageBody.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <template>
  2. <div class="model-body">
  3. <div class="body-item">
  4. <div class="item-title">
  5. <div class="title">{{ $t('management.addedModel') }}</div>
  6. <div class="icon" @click="changeStatusAdd">
  7. <template v-if="added_show_status"> {{ $t('management.upBtn') }} <icon-up /> </template>
  8. <template v-if="!added_show_status"> {{ $t('management.downBtn') }} <icon-down /> </template>
  9. </div>
  10. </div>
  11. <transition name="expand-collapse" @before-enter="beforeEnter" @enter="enter" @leave="leave">
  12. <div v-if="added_show_status">
  13. <ModelList v-for="item in added_data" :key="item.id" :model_item="item" @showMore="showMoreModel"></ModelList>
  14. </div>
  15. </transition>
  16. </div>
  17. <div class="body-item">
  18. <div class="item-title">
  19. <div class="title">{{ $t('management.unaddModel') }}</div>
  20. <div class="icon" @click="changeStatusUnAdd">
  21. <template v-if="unadd_show_status"> {{ $t('management.upBtn') }} <icon-up /> </template>
  22. <template v-if="!unadd_show_status"> {{ $t('management.downBtn') }} <icon-down /> </template>
  23. </div>
  24. </div>
  25. <transition name="expand-collapse" @before-enter="beforeEnter" @enter="enter" @leave="leave">
  26. <div v-if="unadd_show_status" class="card-list">
  27. <CardItem v-for="item in un_added_data" :key="item.id" :name="item.name" :img_src="item.img_src" is_model>
  28. <template #labels>
  29. <div class="labels">{{ item.keyword }}</div>
  30. </template>
  31. <template #description>
  32. <div class="desc">{{ item.desc }}</div>
  33. </template>
  34. <template #bottom>
  35. <a-button>
  36. <template #icon> <icon-plus /> </template>{{ $t('management.addModelBtn') }}</a-button
  37. ></template
  38. >
  39. </CardItem>
  40. </div>
  41. </transition>
  42. </div>
  43. </div>
  44. </template>
  45. <script setup>
  46. import { ref } from 'vue';
  47. import ModelList from './ModelList.vue';
  48. import CardItem from '../../views/manage/CardItem.vue';
  49. import { useCollapse } from './use-collapse';
  50. const { beforeEnter, enter, leave } = useCollapse(1000);
  51. const added_data = ref([
  52. {
  53. id: '1',
  54. name: 'OpenAl-APl-Compatible',
  55. desc: 'LLM,TEXT EMBEDDING,SPEECH2TEXT,MODERATION ',
  56. img_src: 'modelFrame1',
  57. show_more: false,
  58. models: [
  59. {
  60. id: '1-1',
  61. name: 'qwen-2.5-72b-instruct OpenAl-APl'
  62. },
  63. {
  64. id: '1-2',
  65. name: 'qwen-2.5-72b-instruct-gptq-int4 OpenAI-API'
  66. }
  67. ]
  68. },
  69. {
  70. id: '2',
  71. name: 'Tongyi-Qianwen',
  72. desc: 'LLM,TEXT EMBEDDING,SPEECH2TEXT,MODERATION',
  73. img_src: 'modelFrame2',
  74. show_more: false,
  75. models: [
  76. {
  77. id: '2-1',
  78. name: 'qwen-plus'
  79. },
  80. {
  81. id: '2-2',
  82. name: 'qwen-turbo'
  83. },
  84. {
  85. id: '2-3',
  86. name: 'qwen-vl-plus'
  87. }
  88. ]
  89. },
  90. {
  91. id: '3',
  92. name: 'Xinference',
  93. desc: 'LLM,TEXT EMBEDDING,SPEECH2TEXT,MODERATION,TEXT RE-RANK',
  94. img_src: 'modelFrame3',
  95. show_more: false,
  96. models: [
  97. {
  98. id: '3-1',
  99. name: 'basic-bge-large-zh-v1.5'
  100. }
  101. ]
  102. }
  103. ]);
  104. const un_added_data = ref([
  105. {
  106. id: '1',
  107. name: 'OpenAl',
  108. keyword: 'LLM,TEXT',
  109. desc: 'EMBEDDING,SPEECH2TEXT,MODERATION',
  110. img_src: 'modelFrame4'
  111. },
  112. {
  113. id: '2',
  114. name: 'Moonshot',
  115. keyword: 'LLM,TEXT EMBEDDING',
  116. desc: '',
  117. img_src: 'modelFrame5'
  118. },
  119. {
  120. id: '3',
  121. name: 'ZHIPU-AI',
  122. keyword: 'LLM,TEXT',
  123. desc: 'EMBEDDING,SPEECH2TEXT,MODERATION',
  124. img_src: 'modelFrame6'
  125. },
  126. {
  127. id: '4',
  128. name: 'BaiChuan',
  129. keyword: 'LLM,TEXT EMBEDDING',
  130. desc: '',
  131. img_src: 'modelFrame7'
  132. },
  133. {
  134. id: '5',
  135. name: 'DeepSeek',
  136. keyword: 'LLM',
  137. desc: '',
  138. img_src: 'modelFrame8'
  139. },
  140. {
  141. id: '6',
  142. name: 'Mistral',
  143. keyword: 'LLM,TEXT EMBEDDING',
  144. desc: '',
  145. img_src: 'modelFrame9'
  146. },
  147. {
  148. id: '7',
  149. name: 'StepFun',
  150. keyword: 'LLM',
  151. desc: '',
  152. img_src: 'modelFrame10'
  153. }
  154. ]);
  155. // 展开收起状态
  156. const added_show_status = ref(true);
  157. const unadd_show_status = ref(true);
  158. const changeStatusAdd = () => {
  159. added_show_status.value = !added_show_status.value;
  160. if (!added_show_status.value) {
  161. added_data.value.forEach((item) => {
  162. item.show_more = false;
  163. });
  164. }
  165. };
  166. const changeStatusUnAdd = () => {
  167. unadd_show_status.value = !unadd_show_status.value;
  168. };
  169. const showMoreModel = (item) => {
  170. const index = added_data.value.findIndex((u) => u.id === item.id);
  171. if (index !== -1) {
  172. added_data.value[index].show_more = !added_data.value[index].show_more;
  173. }
  174. };
  175. </script>
  176. <style scoped lang="css">
  177. .model-body {
  178. height: calc(100% - 80px);
  179. overflow-y: auto;
  180. }
  181. .model-body::-webkit-scrollbar {
  182. display: none;
  183. }
  184. .body-item {
  185. margin-bottom: 50px;
  186. }
  187. .item-title {
  188. display: flex;
  189. flex-direction: row;
  190. justify-content: space-between;
  191. margin-bottom: 20px;
  192. cursor: pointer;
  193. }
  194. .title {
  195. font-size: 16px;
  196. font-weight: bold;
  197. color: var(--color-text-1);
  198. }
  199. .card-list {
  200. display: grid;
  201. grid-template-columns: repeat(5, 1fr);
  202. gap: 20px;
  203. transition: all 0.3s ease;
  204. .labels {
  205. color: var(--color-text-3);
  206. }
  207. .desc {
  208. font-size: 14px;
  209. }
  210. }
  211. </style>