agentCreate.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
  3. <cus-header title='创建智能体' :showback="false" bgColor="transparent" backUrl="/pages/home"></cus-header>
  4. <div class="title">角色昵称</div>
  5. <div class="inp">
  6. <input v-model="agentDto.agentName" type="text" placeholder="请输入昵称">
  7. </div>
  8. <div class="title">角色模板</div>
  9. <div class="list">
  10. <div class="pre" v-for="(item,index) in list" :key="index" :class="{'active':midx===index}" @tap="changeModel(item,index)">
  11. <image src="@/static/selected.png" v-if="midx===index"></image>
  12. {{item.agentName}}
  13. </div>
  14. </div>
  15. <div class="title">角色介绍</div>
  16. <div class="intro">
  17. <u-parse :content="agentDto.systemPrompt"></u-parse>
  18. </div>
  19. <div class="title">角色音色</div>
  20. <div class="inp" @tap="show=true">
  21. <input type="text" placeholder="请选择音色" disabled v-if="!agentDto.ttsVoiceId">
  22. <text v-else>{{voiceText}}</text>
  23. </div>
  24. <div class="zt_btn" @tap="comfirmSure">确定</div>
  25. <u-picker :itemHeight="88" title="角色音色" :show="show" :columns="voiceList" keyName="name"
  26. @cancel="show=false" @confirm="confirm" :immediateChange="true" style="height: 500rpx;">
  27. </u-picker>
  28. </view>
  29. </template>
  30. <script>
  31. export default {
  32. data(){
  33. return {
  34. list:[],
  35. agentDto:{
  36. "agentName": "",
  37. "asrModelId": "",
  38. "vadModelId": "",
  39. "llmModelId": "",
  40. "ttsModelId": "",
  41. "ttsVoiceId": "",
  42. "memModelId": "",
  43. "intentModelId": "",
  44. "systemPrompt": "",
  45. "langCode": "",
  46. "language": "",
  47. "deviceId": ""
  48. },
  49. modelMap:new Map(),
  50. midx:0,
  51. voiceText:'',
  52. voiceList:[],
  53. show:false
  54. }
  55. },
  56. async onLoad() {
  57. await this.getAgentModelList()
  58. this.getModelVoiceList()
  59. },
  60. methods:{
  61. changeModel(item,index){
  62. this.midx = index;
  63. this.agentDto = this.modelMap.get(item.agentName);
  64. this.getModelVoiceList()
  65. },
  66. getAgentModelList(){
  67. return new Promise((resolve,reject)=>{
  68. this.$api.get('/agent/template').then(res=>{
  69. if(res.data.code!==0) return this.$showToast(res.data.msg)
  70. this.list = res.data.data;
  71. if(this.list.length){
  72. this.agentDto = {...this.agentDto,...this.list[0]}
  73. let map = new Map();
  74. this.list.forEach(l=>{
  75. map.set(l.agentName,l)
  76. })
  77. this.modelMap = map;
  78. }
  79. resolve();
  80. })
  81. })
  82. },
  83. getModelVoiceList(){
  84. this.$api.get(`/models/${this.agentDto.ttsModelId}/voices`).then(res=>{
  85. if(res.data.code!==0) return this.$showToast(res.data.msg)
  86. this.voiceList = [res.data.data];
  87. this.voiceText = res.data.data.find(v=>v.id===this.agentDto.ttsVoiceId)?.name||'';
  88. })
  89. },
  90. comfirmSure(){
  91. let dto = JSON.parse(JSON.stringify(this.agentDto));
  92. this.$api.post('/agent',dto).then(res=>{
  93. if(res.data.code!==0) return this.$showToast(res.data.msg)
  94. this.$showToast('创建成功');
  95. setTimeout(()=>{
  96. uni.reLaunch({
  97. url:'/pages/home'
  98. })
  99. },1500)
  100. })
  101. },
  102. confirm(e){
  103. this.show = false;
  104. this.agentDto.ttsVoiceId = e.value[0].id;
  105. this.voiceText = e.value[0].name;
  106. },
  107. }
  108. }
  109. </script>
  110. <style scoped lang="less">
  111. .page{
  112. background: linear-gradient( 180deg, #E0EEFF 0%, #F6FCFF 100%);
  113. padding: 0 30rpx 30rpx;
  114. box-sizing: border-box;
  115. .title{
  116. font-family: PingFang-SC, PingFang-SC;
  117. font-weight: bold;
  118. font-size: 32rpx;
  119. color: #111111;
  120. line-height: 32rpx;
  121. margin-top: 48rpx;
  122. }
  123. .inp{
  124. margin-top: 40rpx;
  125. background: #FFFFFF;
  126. border-radius: 16rpx;
  127. padding: 30rpx 24rpx;
  128. input{
  129. border: none;
  130. }
  131. }
  132. .list{
  133. margin-top: 20rpx;
  134. display: flex;
  135. flex-wrap: wrap;
  136. margin-left: -10rpx;
  137. .pre{
  138. margin-top: 20rpx;
  139. margin-left: 10rpx;
  140. width: calc(100% / 3 - 10rpx);
  141. height: 80rpx;
  142. background: #FFFFFF;
  143. border-radius: 16rpx;
  144. font-family: PingFangSC, PingFang SC;
  145. font-weight: 400;
  146. font-size: 28rpx;
  147. color: #333333;
  148. line-height: 80rpx;
  149. text-align: center;
  150. position: relative;
  151. &.active{
  152. background: #0066FE;
  153. font-weight: bold;
  154. color: #FFFFFF;
  155. }
  156. image{
  157. width: 48rpx;
  158. height: 48rpx;
  159. position: absolute;
  160. right: 0;
  161. bottom: 0;
  162. z-index: 22;
  163. }
  164. }
  165. }
  166. .intro{
  167. margin-top: 40rpx;
  168. background: #FFFFFF;
  169. border-radius: 16rpx;
  170. padding: 21rpx 24rpx 100rpx;
  171. font-family: PingFangSC, PingFang SC;
  172. font-weight: 400;
  173. font-size: 28rpx;
  174. color: #616161;
  175. line-height: 56rpx;
  176. }
  177. .zt_btn{
  178. margin-top: 96rpx;
  179. }
  180. }
  181. </style>