-
Notifications
You must be signed in to change notification settings - Fork 2k
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
Conversation
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. |
[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 |
color: var(--el-color-primary); | ||
} | ||
} | ||
</style> |
There was a problem hiding this comment.
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:
-
Variable Names: Some variable names can be more descriptive to improve readability.
-
Class Names: The class
.radio-card
should be given appropriate content instead ofline-height
only, as it might clash with existing styles unless specifically targeted. -
HTML Structure: While the structure is correct for displaying options in a radio group, ensure consistency across all elements where similar logic applies.
-
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.
- Ensure the
-
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' |
There was a problem hiding this comment.
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:
-
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"
. -
Field List in Base Node:
- You have duplicate field configurations under different keys (
fields
andglobalFields
). This will likely cause confusion. Consider consolidating them into a single set of fields if they serve similar purposes.
- You have duplicate field configurations under different keys (
-
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'
. -
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:
- Consolidate Field Definitions: If some fields belong together, consolidate their definitions into a more unified structure.
- Update Translations: Double-check all localization paths against actual file locations in your source codebase.
- 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' | |||
}, |
There was a problem hiding this comment.
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.
What this PR does / why we need it?
Summary of your change
Please indicate you've done the following: