langgenius / dify

Dify is an open-source LLM app development platform. Dify's intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototype to production.
https://dify.ai
Other
36.04k stars 4.87k forks source link

unnecessary default dataset_ids in the 'Knowledge Retrieval + Chatbot' and 'Question Classifier + Knowledge + Chatbot' app templates #5357

Open doufa opened 2 weeks ago

doufa commented 2 weeks ago

Self Checks

Dify version

0.6.11

Cloud or Self Hosted

Cloud

Steps to reproduce

  1. Create an app from the template using "Knowledge Retrieval + Chatbot."
  2. On the app detail page, select the "Knowledge Retrieval" node and press the "Add Knowledge" button.
  3. In the knowledge list modal, it shows "1 Knowledge selected" even when no knowledge is selected.
  4. Select a piece of knowledge and press "Add." The Knowledge Retrieval panel then displays two items: one user-selected and one empty.
  5. Attempting to configure the empty knowledge causes the entire page to crash.

✔️ Expected Behavior

Knowledge selected as the user expected

❌ Actual Behavior

empty knowledge selected as default in template "Knowledge Retreival + Chatbot" has one default knowlege "Create app from Question Classifier + Knowledge + Chatbot" has two empty default knowledge

dosubot[bot] commented 2 weeks ago

To resolve the issue of unnecessary default dataset_ids in the "Knowledge Retrieval + Chatbot" and "Question Classifier + Knowledge + Chatbot" app templates, you need to ensure that the default values for the dataset_ids are correctly set to an empty array. Here are the steps and code adjustments you can make:

  1. Set Default Values for Knowledge Retrieval Node: Ensure the dataset_ids default value is an empty array:

    defaultValue: {
       query_variable_selector: [],
       dataset_ids: [],
       retrieval_mode: RETRIEVE_TYPE.oneWay,
    }
  2. Validation Logic for Knowledge Retrieval Node: Ensure the validation logic checks for the presence of required fields:

    checkValid(payload: KnowledgeRetrievalNodeType, t: any) {
       let errorMessages = ''
       if (!errorMessages && (!payload.query_variable_selector || payload.query_variable_selector.length === 0))
           errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.knowledgeRetrieval.queryVariable`) })
    
       if (!errorMessages && (!payload.dataset_ids || payload.dataset_ids.length === 0))
           errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.knowledgeRetrieval.knowledge`) })
    
       if (!errorMessages && payload.retrieval_mode === RETRIEVE_TYPE.multiWay && !payload.multiple_retrieval_config?.reranking_model?.provider)
           errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.errorMsg.fields.rerankModel`) })
    
       if (!errorMessages && payload.retrieval_mode === RETRIEVE_TYPE.oneWay && !payload.single_retrieval_config?.model?.provider)
           errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t('common.modelProvider.systemReasoningModel.key') })
    
       return {
           isValid: !errorMessages,
           errorMessage: errorMessages,
       }
    }
  3. Set Default Values for Question Classifier Node: Ensure the dataset_ids default value is an empty array:

    defaultValue: {
       query_variable_selector: [],
       model: {
           provider: '',
           name: '',
           mode: 'chat',
           completion_params: {
               temperature: 0.7,
           },
       },
       classes: [
           {
               id: '1',
               name: '',
           },
           {
               id: '2',
               name: '',
           },
       ],
    }
  4. Validation Logic for Question Classifier Node: Ensure the validation logic checks for the presence of required fields:

    checkValid(payload: QuestionClassifierNodeType, t: any) {
       let errorMessages = ''
       if (!errorMessages && (!payload.query_variable_selector || payload.query_variable_selector.length === 0))
           errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.questionClassifiers.inputVars`) })
    
       if (!errorMessages && !payload.model.provider)
           errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.questionClassifiers.model`) })
    
       if (!errorMessages && (!payload.classes || payload.classes.length === 0))
           errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.questionClassifiers.class`) })
    
       if (!errorMessages && (payload.classes.some(item => !item.name)))
           errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.questionClassifiers.topicName`) })
    
       return {
           isValid: !errorMessages,
           errorMessage: errorMessages,
       }
    }

By ensuring these default values and validation checks are correctly implemented, you should be able to resolve the issue of unnecessary default dataset_ids and prevent the app from crashing when configuring empty knowledge items [1][2].

To continue talking to Dosu, mention @dosu.