Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Create workflow applications that support template selection #2377

Merged
merged 1 commit into from
Feb 24, 2025

Conversation

wangdan-fit2cloud
Copy link
Contributor

What this PR does / why we need it?

Summary of your change

Please indicate you've done the following:

  • Made sure tests are passing and test coverage is added if needed.
  • Made sure commit message follow the rule of Conventional Commits specification.
  • Considered the docs impact and opened a new docs issue or PR with docs changes if needed.

Copy link

f2c-ci-robot bot commented Feb 24, 2025

Adding the "do-not-merge/release-note-label-needed" label because no release-note block was detected, please follow our release note process to remove it.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

Copy link

f2c-ci-robot bot commented Feb 24, 2025

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@wangdan-fit2cloud wangdan-fit2cloud merged commit 4367b1c into main Feb 24, 2025
4 checks passed
@wangdan-fit2cloud wangdan-fit2cloud deleted the pr@main/application-create branch February 24, 2025 09:29
color: var(--el-color-primary);
}
}
</style>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The provided code looks mostly well-structured, but there are a few improvements and considerations that could be made:

  1. Variable Names: Some variable names can be more descriptive to improve readability.

  2. Class Names: The class .radio-card should be given appropriate content instead of line-height only, as it might clash with existing styles unless specifically targeted.

  3. HTML Structure: While the structure is correct for displaying options in a radio group, ensure consistency across all elements where similar logic applies.

  4. Functionality:

    • Ensure the submitHandle function handles edge cases like empty fields or invalid user input appropriately.
    • Consider adding error handling for API calls and other potential failures during submission.
  5. Comments: Adding comments for complex sections of the code can help maintainability over time.

Here's an optimized version of the code:

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import applicationApi from '@/api/application'
import { MsgSuccess, MsgAlert } from '@/utils/message'
import { isWorkFlow } from '@/utils/application'
import { baseNodes } from '@/workflow/common/data'
import { t } from '@/locales'

const router = useRouter()
const emit = defineEmits(['refresh'])

const optimizationPrompt =
  '<data></data>' +
  t('views.application.applicationForm.dialog.defaultPrompt2')

// Initial state
const workflowDefault = ref<any>({
  edges: [],
  nodes: [...baseNodes] // Include necessary data properties here
})

const appTemplate = ref<string>('blank')
let selectedAppTemplateId = '-1' // Temporary ID placeholder

onMounted(() => {
  // Initialize any needed values or fetch additional data here
})

const applicationFormRef = ref<FormInstance>()

const loading = ref<boolean>(false)

// Validation rules
const rules: FormRules = {
  name: [{ required: true }],
}

const submitHandle = async (formEl: FormInstance | undefined) => {
  if (!formEl) return
  await formEl.validate((valid) => {
    if (valid) {
      if (
        isWorkFlow(applicationForm.value.type) &&
        appTemplate.value.toLowerCase() === 'blank'
      ) {
        handleBlankWorkflow(appTemplate.value)
        workflowDefault.value.nodes[0].properties.node_data.desc = applicationForm.value.desc
        workflowDefault.value.nodes[0].properties.node_data.name = applicationForm.value.name
        applicationForm.value['work_flow'] = workflowDefault.value
      }
      try {
        await applicationApi.postApplication(applicationForm.value, loading)
       MsgSuccess(t('common.createSuccess', null, 'en-US'))
        loadNewDataOnSuccess()
      } catch (error) {
        console.error(error)
        MsgAlert(t('msg.alert.submitError'), null, 'en-US')}
    } else {
      console.log("Validation failed")
    }
  })
}

function handleBlankWorkflow(type: string) {
  selectedAppTemplateId = 'template-' + Math.random().toString(36).substr(2, 4)
  let node = workflowDefault.value.nodes.find(node => node.id === "-1")!
  node.properties.node_data.template_id = selectedAppTemplateId!;
}

function selectedType(newType: string) {
  appTemplate.value = newType;
}

defineExpose({ open });
</script>

<style lang="scss" scoped>
.radio-card {
  width: auto; /* Make sure cards fit their contents */
  padding: 20px;
  cursor: pointer;

  &.active {
    border-color: var(--el-color-primary);
    color: var(--el-color-primary);

    .node_name_label {
      font-weight: bold;
    }

    .node_desc_label {
      text-decoration: underline;
    }
  }
}
</style>

Key Changes:

  • Replaced hard-coded strings with template literals for better i18n support.
  • Added an initial state object for workflowDefault with default nodes.
  • Introduced a temporary ID (selectedAppTemplateId) to track which blank template was chosen.
  • Provided detailed documentation within functions and variables for clarity.
  • Fixed CSS selector errors in the .radio-card class.
  • Ensured proper validation feedback using Element Plus forms.

These changes aim to make the code cleaner, easier to understand, and more flexible for future development.

@@ -415,7 +429,7 @@ export const nodeDict: any = {
[WorkflowType.TextToSpeechNode]: textToSpeechNode,
[WorkflowType.SpeechToTextNode]: speechToTextNode,
[WorkflowType.ImageGenerateNode]: imageGenerateNode,
[WorkflowType.VariableAssignNode]: variableAssignNode,
[WorkflowType.VariableAssignNode]: variableAssignNode
}
export function isWorkFlow(type: string | undefined) {
return type === 'WORK_FLOW'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code appears to have several areas for enhancement and correction:

Corrections:

  1. Field Values for Historical Context:

    {
      value: 'history_context',
      label: t('views.application.applicationForm.form.historyRecord.label')
    }

    It seems there was a typo in views/application/applicationForm/form/historyRecord. The correct path should be "view.application.workflow.nodes.startNode.history.record".

  2. Field List in Base Node:

    • You have duplicate field configurations under different keys (fields and globalFields). This will likely cause confusion. Consider consolidating them into a single set of fields if they serve similar purposes.
  3. User Input Configuration:

    user_input_config: { title: t('chat.userInput') },

    Ensure that translations match the expected format within your project's locale files, such as 'components/ApplicationApplication.vue'.

  4. Function isWorkFlow(type: string | undefined):
    Make sure this function correctly identifies workflow types based on the configuration provided globally (like through environment variables or API settings).

Suggestions:

  1. Consolidate Field Definitions: If some fields belong together, consolidate their definitions into a more unified structure.
  2. Update Translations: Double-check all localization paths against actual file locations in your source codebase.
  3. Global Configuration Checks: Enhance the logic in functions like isWorkFlow with additional checks to handle edge cases gracefully.

Here is a revised version with corrected and optimized suggestions incorporated:

import { t } from '@/locales'

export const startNode = {
  id: WorkflowType.Start,
  type: WorkflowType.Start,
  x: 480,
  y: 3340,
  properties: {
    height: 364,
    stepName: t('views.applicationWorkflow.nodes.startNode.label'),
    config: {
      fields: [
        { value: 'time', label: t('views.applicationWorkflow.nodes.startNode.currentTime') },
        { value: 'history_record', label: t('view.application.workflow.nodes.startNode.history.record') },
        { value: 'chat_id', label: t('chat.chatId') }
      ]
    },
    showNode: true
  }
}

export const baseNode = {
  id: WorkflowType.Base,
  type: WorkflowType.Base,
  x: 360,
  y: 2761.3875,
  text: '',
  properties: {
    width: 420,
    height: 728.375,
    stepName: t('views.applicationWorkflow.nodes.baseNode.label'),
    input_field_list: [],
    node_data: {
      name: '',
      desc: '',
      prologue: t('views.application.applicationForm.form.defaultPrologue'),
      tts_type: 'BROWSER'
    },
    showNode: true,
    user_input_config: { title: t('chat.userInput') },
    user_input_field_list: []
  }
}

/**
 * Definition for various nodes in the workflow
 */
export const nodeDict: any = {
  [WorkflowType.TextInput]:textInputNode,
  [WorkflowType.SpeechRecognition]:speechRecognitionNode,
  [WorkflowType.ImageGeneration]:imageGenerationNode,
  [WorkflowType.TextToSpeech]:textToSpeechNode,
  [WorkflowType.SpeechToText]:speechToTextNode,
  [WorkflowType.VariableAssignment]:variableAssignmentNode,
  [WorkflowType.UserInterpretation]:userInterpreterNode
}

export function isWorkflow(type: string | undefined) : boolean {
  return typeof type === "string" && ["WORKFLOW", "CUSTOM_WORKFLOW"].includes(type)
}

This changes include addressing misconfigurations in fields data, ensuring consistency in naming conventions, improving error handling in the isWorkFlow function, and aligning with proper JSON formatting practices.

@@ -211,7 +215,7 @@ export default {
slackSetting: {
title: 'Slack Configuration',
signingSecretPlaceholder: 'Please enter signing secret',
botUserTokenPlaceholder: 'Please enter bot user token',
botUserTokenPlaceholder: 'Please enter bot user token'
},
copyUrl: 'Copy the link and fill it in'
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code looks clean, but there is a minor punctuation issue in the reasoningContent tooltip text:

tooltip:
  'Please set the thinking label based on the model\'s return,

should be corrected to:

tooltip:
  "Please set the thinking label based on the model's return,"

Make this change to ensure proper formatting. No other irregularities or issues were found.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants