Merge branch 'feat/llm-struct-output' of https://github.com/langgenius/dify into feat/llm-struct-output

This commit is contained in:
twwu 2025-04-02 14:11:37 +08:00
commit 268364a3e8
8 changed files with 54 additions and 43 deletions

View File

@ -1,5 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="arrow-down-round-fill"> <g id="arrow-down-round-fill">
<path id="Vector" d="M6.02913 6.23572C5.08582 6.23572 4.56482 7.33027 5.15967 8.06239L7.13093 10.4885C7.57922 11.0403 8.42149 11.0403 8.86986 10.4885L10.8411 8.06239C11.4359 7.33027 10.9149 6.23572 9.97158 6.23572H6.02913Z" fill="#101828" fill-opacity="0.3"/> <path id="Vector" d="M6.02913 6.23572C5.08582 6.23572 4.56482 7.33027 5.15967 8.06239L7.13093 10.4885C7.57922 11.0403 8.42149 11.0403 8.86986 10.4885L10.8411 8.06239C11.4359 7.33027 10.9149 6.23572 9.97158 6.23572H6.02913Z" fill="#101828"/>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 380 B

View File

@ -24,8 +24,7 @@
"attributes": { "attributes": {
"id": "Vector", "id": "Vector",
"d": "M6.02913 6.23572C5.08582 6.23572 4.56482 7.33027 5.15967 8.06239L7.13093 10.4885C7.57922 11.0403 8.42149 11.0403 8.86986 10.4885L10.8411 8.06239C11.4359 7.33027 10.9149 6.23572 9.97158 6.23572H6.02913Z", "d": "M6.02913 6.23572C5.08582 6.23572 4.56482 7.33027 5.15967 8.06239L7.13093 10.4885C7.57922 11.0403 8.42149 11.0403 8.86986 10.4885L10.8411 8.06239C11.4359 7.33027 10.9149 6.23572 9.97158 6.23572H6.02913Z",
"fill": "currentColor", "fill": "currentColor"
"fill-opacity": "0.3"
}, },
"children": [] "children": []
} }

View File

@ -376,6 +376,7 @@ function Form<
tooltip={tooltip?.[language] || tooltip?.en_US} tooltip={tooltip?.[language] || tooltip?.en_US}
value={value[variable] || []} value={value[variable] || []}
onChange={item => handleFormChange(variable, item as any)} onChange={item => handleFormChange(variable, item as any)}
supportCollapse
/> />
{fieldMoreInfo?.(formSchema)} {fieldMoreInfo?.(formSchema)}
{validating && changeKey === variable && <ValidatingTip />} {validating && changeKey === variable && <ValidatingTip />}

View File

@ -2,7 +2,6 @@ import React from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { import {
RiAddLine, RiAddLine,
RiArrowDropDownLine,
RiQuestionLine, RiQuestionLine,
} from '@remixicon/react' } from '@remixicon/react'
import ToolSelector from '@/app/components/plugins/plugin-detail-panel/tool-selector' import ToolSelector from '@/app/components/plugins/plugin-detail-panel/tool-selector'
@ -13,6 +12,7 @@ import type { ToolValue } from '@/app/components/workflow/block-selector/types'
import type { Node } from 'reactflow' import type { Node } from 'reactflow'
import type { NodeOutPutVar } from '@/app/components/workflow/types' import type { NodeOutPutVar } from '@/app/components/workflow/types'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
import { ArrowDownRoundFill } from '@/app/components/base/icons/src/vender/solid/general'
type Props = { type Props = {
disabled?: boolean disabled?: boolean
@ -98,14 +98,12 @@ const MultipleToolSelector = ({
</Tooltip> </Tooltip>
)} )}
{supportCollapse && ( {supportCollapse && (
<div className='absolute -left-4 top-1'> <ArrowDownRoundFill
<RiArrowDropDownLine className={cn(
className={cn( 'h-4 w-4 cursor-pointer text-text-quaternary group-hover/collapse:text-text-secondary',
'h-4 w-4 text-text-tertiary', collapse && 'rotate-[270deg]',
collapse && '-rotate-90', )}
)} />
/>
</div>
)} )}
</div> </div>
{value.length > 0 && ( {value.length > 0 && (

View File

@ -1,5 +1,5 @@
import type { ReactNode } from 'react' import type { ReactNode } from 'react'
import { useState } from 'react' import { useMemo, useState } from 'react'
import { ArrowDownRoundFill } from '@/app/components/base/icons/src/vender/solid/general' import { ArrowDownRoundFill } from '@/app/components/base/icons/src/vender/solid/general'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
@ -7,12 +7,12 @@ export { default as FieldCollapse } from './field-collapse'
type CollapseProps = { type CollapseProps = {
disabled?: boolean disabled?: boolean
trigger: React.JSX.Element trigger: React.JSX.Element | ((collapseIcon: React.JSX.Element | null) => React.JSX.Element)
children: React.JSX.Element children: React.JSX.Element
collapsed?: boolean collapsed?: boolean
onCollapse?: (collapsed: boolean) => void onCollapse?: (collapsed: boolean) => void
operations?: ReactNode operations?: ReactNode
hideCollapseIcon?: boolean
} }
const Collapse = ({ const Collapse = ({
disabled, disabled,
@ -21,10 +21,23 @@ const Collapse = ({
collapsed, collapsed,
onCollapse, onCollapse,
operations, operations,
hideCollapseIcon,
}: CollapseProps) => { }: CollapseProps) => {
const [collapsedLocal, setCollapsedLocal] = useState(true) const [collapsedLocal, setCollapsedLocal] = useState(true)
const collapsedMerged = collapsed !== undefined ? collapsed : collapsedLocal const collapsedMerged = collapsed !== undefined ? collapsed : collapsedLocal
const collapseIcon = useMemo(() => {
if (disabled)
return null
return (
<ArrowDownRoundFill
className={cn(
'h-4 w-4 cursor-pointer text-text-quaternary group-hover/collapse:text-text-secondary',
collapsedMerged && 'rotate-[270deg]',
)}
/>
)
}, [collapsedMerged, disabled])
return ( return (
<> <>
<div className='group/collapse flex items-center'> <div className='group/collapse flex items-center'>
@ -37,19 +50,12 @@ const Collapse = ({
} }
}} }}
> >
{trigger} {typeof trigger === 'function' ? trigger(collapseIcon) : trigger}
<div className='h-4 w-4 shrink-0'> {!hideCollapseIcon && (
{ <div className='h-4 w-4 shrink-0'>
!disabled && ( {collapseIcon}
<ArrowDownRoundFill </div>
className={cn( )}
'h-4 w-4 cursor-pointer text-text-quaternary group-hover/collapse:text-text-secondary',
collapsedMerged && 'rotate-[270deg]',
)}
/>
)
}
</div>
</div> </div>
{operations} {operations}
</div> </div>

View File

@ -49,20 +49,23 @@ const ErrorHandle = ({
disabled={!error_strategy} disabled={!error_strategy}
collapsed={collapsed} collapsed={collapsed}
onCollapse={setCollapsed} onCollapse={setCollapsed}
hideCollapseIcon
trigger={ trigger={
<div className='flex grow items-center justify-between pr-4'> collapseIcon => (
<div className='flex items-center'> <div className='flex grow items-center justify-between pr-4'>
<div className='system-sm-semibold-uppercase mr-0.5 text-text-secondary'> <div className='flex items-center'>
{t('workflow.nodes.common.errorHandle.title')} <div className='system-sm-semibold-uppercase mr-0.5 text-text-secondary'>
{t('workflow.nodes.common.errorHandle.title')}
</div>
<Tooltip popupContent={t('workflow.nodes.common.errorHandle.tip')} />
{collapseIcon}
</div> </div>
<Tooltip popupContent={t('workflow.nodes.common.errorHandle.tip')} /> <ErrorHandleTypeSelector
value={error_strategy || ErrorHandleTypeEnum.none}
onSelected={getHandleErrorHandleTypeChange(data)}
/>
</div> </div>
<ErrorHandleTypeSelector )}
value={error_strategy || ErrorHandleTypeEnum.none}
onSelected={getHandleErrorHandleTypeChange(data)}
/>
</div>
}
> >
<> <>
{ {

View File

@ -50,6 +50,7 @@ const ErrorHandleTypeSelector = ({
> >
<PortalToFollowElemTrigger onClick={(e) => { <PortalToFollowElemTrigger onClick={(e) => {
e.stopPropagation() e.stopPropagation()
e.nativeEvent.stopImmediatePropagation()
setOpen(v => !v) setOpen(v => !v)
}}> }}>
<Button <Button
@ -68,6 +69,7 @@ const ErrorHandleTypeSelector = ({
className='flex cursor-pointer rounded-lg p-2 pr-3 hover:bg-state-base-hover' className='flex cursor-pointer rounded-lg p-2 pr-3 hover:bg-state-base-hover'
onClick={(e) => { onClick={(e) => {
e.stopPropagation() e.stopPropagation()
e.nativeEvent.stopImmediatePropagation()
onSelected(option.value) onSelected(option.value)
setOpen(false) setOpen(false)
}} }}

View File

@ -38,7 +38,8 @@ const MetadataFilter = ({
disabled={metadataFilterMode === MetadataFilteringModeEnum.disabled || metadataFilterMode === MetadataFilteringModeEnum.manual} disabled={metadataFilterMode === MetadataFilteringModeEnum.disabled || metadataFilterMode === MetadataFilteringModeEnum.manual}
collapsed={collapsed} collapsed={collapsed}
onCollapse={setCollapsed} onCollapse={setCollapsed}
trigger={ hideCollapseIcon
trigger={collapseIcon => (
<div className='flex grow items-center justify-between pr-4'> <div className='flex grow items-center justify-between pr-4'>
<div className='flex items-center'> <div className='flex items-center'>
<div className='system-sm-semibold-uppercase mr-0.5 text-text-secondary'> <div className='system-sm-semibold-uppercase mr-0.5 text-text-secondary'>
@ -51,6 +52,7 @@ const MetadataFilter = ({
</div> </div>
)} )}
/> />
{collapseIcon}
</div> </div>
<div className='flex items-center'> <div className='flex items-center'>
<MetadataFilterSelector <MetadataFilterSelector
@ -66,7 +68,7 @@ const MetadataFilter = ({
} }
</div> </div>
</div> </div>
} )}
> >
<> <>
{ {
@ -85,8 +87,8 @@ const MetadataFilter = ({
provider={metadataModelConfig?.provider || ''} provider={metadataModelConfig?.provider || ''}
completionParams={metadataModelConfig?.completion_params || { temperature: 0.7 }} completionParams={metadataModelConfig?.completion_params || { temperature: 0.7 }}
modelId={metadataModelConfig?.name || ''} modelId={metadataModelConfig?.name || ''}
setModel={handleMetadataModelChange || (() => {})} setModel={handleMetadataModelChange || (() => { })}
onCompletionParamsChange={handleMetadataCompletionParamsChange || (() => {})} onCompletionParamsChange={handleMetadataCompletionParamsChange || (() => { })}
hideDebugWithMultipleModel hideDebugWithMultipleModel
debugWithMultipleModel={false} debugWithMultipleModel={false}
/> />