|
@@ -0,0 +1,332 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <a-button
|
|
|
|
|
+ v-if="typeAngint == 'edit'"
|
|
|
|
|
+ type="text"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ @click="editClick"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template #icon>
|
|
|
|
|
+ <icon-tool />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </a-button>
|
|
|
|
|
+ <!-- <a-button v-if="typeAngint=='add'" style="margin-left: 10px" type="primary" @click="handleClick">确定</a-button>-->
|
|
|
|
|
+ <a-modal
|
|
|
|
|
+ v-model:visible="visible"
|
|
|
|
|
+ title=""
|
|
|
|
|
+ @before-open="handleOpened"
|
|
|
|
|
+ @cancel="handleCancel"
|
|
|
|
|
+ :footer="false"
|
|
|
|
|
+ title-align="start"
|
|
|
|
|
+ fullscreen
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="main-container">
|
|
|
|
|
+ <div class="main-container-lf">
|
|
|
|
|
+ <div style="padding: 10px;font-size: 16px;background: var(--color-neutral-3);">智能体配置</div>
|
|
|
|
|
+ <div style="display: flex;width: 100%;" :style="{height:height}">
|
|
|
|
|
+ <div style="width: 50%;height: 100%">
|
|
|
|
|
+ <div style="padding: 10px;font-size: 12px;color: #2a2a2b;">智能体画像</div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <a-textarea v-model="system" placeholder="" disabled style="height: 400px;" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div style="width: 50%;border: 1px solid var(--color-neutral-3);background: var(--color-neutral-3)">
|
|
|
|
|
+ <a-form ref="formRef" :rules="rules" :model="form" @submit="handleSubmit" layout="vertical" >
|
|
|
|
|
+ <a-collapse :default-active-key="['1']">
|
|
|
|
|
+ <a-collapse-item header="基础信息" key="0" v-if="typeAngint == 'edit'">
|
|
|
|
|
+ <a-input v-model="form.name" placeholder="请输入智能体名称" style="width:200px;margin-top: 10px" />
|
|
|
|
|
+ </a-collapse-item>
|
|
|
|
|
+ <a-collapse-item header="AI模型配置" key="1">
|
|
|
|
|
+ <a-form-item field="llm_id" label="模型">
|
|
|
|
|
+ <a-space direction="vertical" size="large">
|
|
|
|
|
+ <a-select :size="'large'" field="llm_id" v-model="form.llm_id" :style="{width:'25rem'}" placeholder="请选择 ...">
|
|
|
|
|
+ <a-optgroup
|
|
|
|
|
+ :label="index"
|
|
|
|
|
+ v-for="(item, index) in modelList"
|
|
|
|
|
+ :key="index"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-option
|
|
|
|
|
+ v-for="obj in item"
|
|
|
|
|
+ :key="obj.fid"
|
|
|
|
|
+ :disabled="!obj.available"
|
|
|
|
|
+ :value="obj.llm_id"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ obj.llm_name }}
|
|
|
|
|
+ </a-option>
|
|
|
|
|
+ </a-optgroup>
|
|
|
|
|
+ </a-select>
|
|
|
|
|
+ </a-space>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-collapse-item>
|
|
|
|
|
+ <a-collapse-item header="开场引导" :key="'2'" disabled>
|
|
|
|
|
+ </a-collapse-item>
|
|
|
|
|
+ <a-collapse-item header="知识库" key="3">
|
|
|
|
|
+ <a-form-item field="kb_ids" label="知识库">
|
|
|
|
|
+ <a-select
|
|
|
|
|
+ v-model="form.kb_ids"
|
|
|
|
|
+ :style="{ width: '25rem' }"
|
|
|
|
|
+ placeholder="请选择 ..."
|
|
|
|
|
+ multiple
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-option
|
|
|
|
|
+ v-for="item in tabs"
|
|
|
|
|
+ :key="item.id"
|
|
|
|
|
+ :value="item.id"
|
|
|
|
|
+ >{{ item.name }}</a-option
|
|
|
|
|
+ >
|
|
|
|
|
+ </a-select>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-collapse-item>
|
|
|
|
|
+ <a-collapse-item header="工具" key="4" disabled>
|
|
|
|
|
+ </a-collapse-item>
|
|
|
|
|
+ <a-collapse-item header="工作流" key="5" disabled>
|
|
|
|
|
+ </a-collapse-item>
|
|
|
|
|
+ </a-collapse>
|
|
|
|
|
+
|
|
|
|
|
+ <a-form-item>
|
|
|
|
|
+ <div
|
|
|
|
|
+ style="
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ right: 10px;
|
|
|
|
|
+ top: 0px;
|
|
|
|
|
+ z-index: 99999;
|
|
|
|
|
+ "
|
|
|
|
|
+ >
|
|
|
|
|
+ <!-- <a-button @click="visible = false">取消</a-button>-->
|
|
|
|
|
+ <a-button
|
|
|
|
|
+ style="margin-left: 10px"
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ html-type="submit"
|
|
|
|
|
+ >保存</a-button
|
|
|
|
|
+ >
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-form>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="main-container-rt">
|
|
|
|
|
+ <sessionAction></sessionAction>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </a-modal>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script lang="ts" setup>
|
|
|
|
|
+ import { onMounted, onBeforeMount, reactive, ref, nextTick } from 'vue';
|
|
|
|
|
+ import { IconSend } from '@arco-design/web-vue/es/icon';
|
|
|
|
|
+ import { queryKbList, queryModelList } from '@/api/kbList';
|
|
|
|
|
+ import useLoading from '@/hooks/loading';
|
|
|
|
|
+ import { dialogSet } from '@/api/Agent';
|
|
|
|
|
+ import { Message } from '@arco-design/web-vue';
|
|
|
|
|
+ import EventBus from "@/utils/EventBus";
|
|
|
|
|
+ import sessionAction from "@/views/dmx/IntelligentAgent/components/sessionAction.vue";
|
|
|
|
|
+ const { setLoading } = useLoading(true);
|
|
|
|
|
+ const props = defineProps(['typeAngint', 'formData']);
|
|
|
|
|
+ const visible = ref(false);
|
|
|
|
|
+ const loading = ref(false);
|
|
|
|
|
+ const form = reactive({
|
|
|
|
|
+ name: '',
|
|
|
|
|
+ icon: '',
|
|
|
|
|
+ language: 'English',
|
|
|
|
|
+ prompt_config: {
|
|
|
|
|
+ empty_response: '',
|
|
|
|
|
+ prologue: '你好! 我是你的助理,有什么可以帮到你的吗?',
|
|
|
|
|
+ quote: true,
|
|
|
|
|
+ self_rag: true,
|
|
|
|
|
+ system:
|
|
|
|
|
+ '示例:\n' +
|
|
|
|
|
+ '你是 XX,具有 XX 经验,擅长 XX,…\n' +
|
|
|
|
|
+ '你的任务是 XX ,需要按照以下步骤执行:\n' +
|
|
|
|
|
+ '1. XX\n' +
|
|
|
|
|
+ '2. XX\n' +
|
|
|
|
|
+ '3. …\n' +
|
|
|
|
|
+ '{knowlege}',
|
|
|
|
|
+ parameters: [
|
|
|
|
|
+ {
|
|
|
|
|
+ key: 'knowledge',
|
|
|
|
|
+ optional: false,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ kb_ids: [],
|
|
|
|
|
+ llm_id: 'qwen-plus',
|
|
|
|
|
+ llm_setting: {
|
|
|
|
|
+ temperature: 0.1,
|
|
|
|
|
+ top_p: 0.3,
|
|
|
|
|
+ presence_penalty: 0.4,
|
|
|
|
|
+ frequency_penalty: 0.7,
|
|
|
|
|
+ max_tokens: 512,
|
|
|
|
|
+ },
|
|
|
|
|
+ similarity_threshold: 0.2,
|
|
|
|
|
+ vector_similarity_weight: 0.30000000000000004,
|
|
|
|
|
+ top_n: 8,
|
|
|
|
|
+ });
|
|
|
|
|
+ const system = ref('');
|
|
|
|
|
+ const embdId = ref('');
|
|
|
|
|
+ const modelList = ref({});
|
|
|
|
|
+ const renderData = ref([]);
|
|
|
|
|
+ const formRef = ref(null);
|
|
|
|
|
+ let tabs = ref([]);
|
|
|
|
|
+ const height = ref('calc(100vh - 150px)');
|
|
|
|
|
+ const emit = defineEmits(['cancelModal']);
|
|
|
|
|
+ const rules = {
|
|
|
|
|
+ name: [
|
|
|
|
|
+ {
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ message: '名称不允许为空',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ llm_id: [
|
|
|
|
|
+ {
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ message: '模型不能为空',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ kb_ids: [
|
|
|
|
|
+ {
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ message: '知识库不能为空',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const handleSubmit = async ({ values, errors }) => {
|
|
|
|
|
+ // console.log('values:', values, '\nerrors:', errors)
|
|
|
|
|
+ if(!errors){
|
|
|
|
|
+ let title = '创建成功';
|
|
|
|
|
+ let formNew = { ...form };
|
|
|
|
|
+ if (props.typeAngint == 'edit') {
|
|
|
|
|
+ formNew.dialog_id = form.id;
|
|
|
|
|
+ delete formNew.id;
|
|
|
|
|
+ delete formNew.off;
|
|
|
|
|
+ title = '修改成功';
|
|
|
|
|
+ }
|
|
|
|
|
+ const data = await dialogSet(formNew);
|
|
|
|
|
+ if (data.code == 0) {
|
|
|
|
|
+ Message.success(title);
|
|
|
|
|
+ handleCancel();
|
|
|
|
|
+ EventBus.emit('queryList');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const editClick = (data) => {
|
|
|
|
|
+ visible.value = true;
|
|
|
|
|
+
|
|
|
|
|
+ console.log(props.formData);
|
|
|
|
|
+ Object.assign(form, props.formData);
|
|
|
|
|
+ console.log(form);
|
|
|
|
|
+ system.value = form.prompt_config.system;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const handleClick = (data) => {
|
|
|
|
|
+ visible.value = true;
|
|
|
|
|
+ nextTick(() => {
|
|
|
|
|
+ Object.assign(form, data);
|
|
|
|
|
+ console.log(form,'传值');
|
|
|
|
|
+ system.value = form.prompt_config.system;
|
|
|
|
|
+ if(tabs.value && tabs.value.length>0){
|
|
|
|
|
+ form.kb_ids = [tabs.value[0].id];
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+ defineExpose({
|
|
|
|
|
+ handleClick,
|
|
|
|
|
+ });
|
|
|
|
|
+ const handleBeforeOk = (done) => {
|
|
|
|
|
+ formRef.value.validate().then((res) => {
|
|
|
|
|
+ console.log('form:', form);
|
|
|
|
|
+ if (!form.name) {
|
|
|
|
|
+ done(false);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.log('请求数据');
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+ const handleCancel = () => {
|
|
|
|
|
+ visible.value = false;
|
|
|
|
|
+ emit('cancelModal');
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const handleOpened = (el) => {
|
|
|
|
|
+ // formRef.value.resetFields();
|
|
|
|
|
+ };
|
|
|
|
|
+ const queryModel = async (params) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const data = await queryModelList(params);
|
|
|
|
|
+ console.log(data.data, '大模型列表');
|
|
|
|
|
+ modelList.value = data.data;
|
|
|
|
|
+ } catch (err) {
|
|
|
|
|
+ // you can report use errorHandler or other
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+ const file = ref();
|
|
|
|
|
+
|
|
|
|
|
+ const onChange = (_, currentFile) => {
|
|
|
|
|
+ file.value = {
|
|
|
|
|
+ ...currentFile,
|
|
|
|
|
+ // url: URL.createObjectURL(currentFile.file),
|
|
|
|
|
+ };
|
|
|
|
|
+ };
|
|
|
|
|
+ const onProgress = (currentFile) => {
|
|
|
|
|
+ file.value = currentFile;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const knowledgeData = async (params = { page: 1, page_size: 20 }) => {
|
|
|
|
|
+ setLoading(true);
|
|
|
|
|
+ try {
|
|
|
|
|
+ const { data } = await queryKbList(params);
|
|
|
|
|
+ console.log(data, 'data');
|
|
|
|
|
+ nextTick(() => {
|
|
|
|
|
+ tabs.value = data;
|
|
|
|
|
+ console.log(tabs.value, 'tabs');
|
|
|
|
|
+ });
|
|
|
|
|
+ } catch (err) {
|
|
|
|
|
+ // you can report use errorHandler or other
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ setLoading(false);
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ onBeforeMount(() => {
|
|
|
|
|
+ queryModel({});
|
|
|
|
|
+ knowledgeData();
|
|
|
|
|
+ });
|
|
|
|
|
+ onMounted(() => {});
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style scoped lang="less">
|
|
|
|
|
+ .main-container {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ .main-container-lf {
|
|
|
|
|
+ width: 60%;
|
|
|
|
|
+ }
|
|
|
|
|
+ .main-container-rt {
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ width: 40%;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ .bottom {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ bottom: 40px;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ .input {
|
|
|
|
|
+ margin-left: 20%;
|
|
|
|
|
+ width: 60%;
|
|
|
|
|
+ }
|
|
|
|
|
+ .text {
|
|
|
|
|
+ margin-left: 40%;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ color: lightgrey;
|
|
|
|
|
+ line-height: 40px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ :deep(.arco-textarea-wrapper.arco-textarea-disabled){
|
|
|
|
|
+ background: var(--color-bg-2);
|
|
|
|
|
+ color: var(--color-text-1);
|
|
|
|
|
+ }
|
|
|
|
|
+</style>
|