mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-04 04:43:09 +00:00 
			
		
		
		
	Signed-off-by: yihong0618 <zouzou0208@gmail.com> Signed-off-by: -LAN- <laipz8200@outlook.com> Signed-off-by: xhe <xw897002528@gmail.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: takatost <takatost@gmail.com> Co-authored-by: kurokobo <kuro664@gmail.com> Co-authored-by: Novice Lee <novicelee@NoviPro.local> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: AkaraChen <akarachen@outlook.com> Co-authored-by: Yi <yxiaoisme@gmail.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: JzoNg <jzongcode@gmail.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: Hiroshi Fujita <fujita-h@users.noreply.github.com> Co-authored-by: AkaraChen <85140972+AkaraChen@users.noreply.github.com> Co-authored-by: NFish <douxc512@gmail.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Novice <857526207@qq.com> Co-authored-by: Hiroki Nagai <82458324+nagaihiroki-git@users.noreply.github.com> Co-authored-by: Gen Sato <52241300+halogen22@users.noreply.github.com> Co-authored-by: eux <euxuuu@gmail.com> Co-authored-by: huangzhuo1949 <167434202+huangzhuo1949@users.noreply.github.com> Co-authored-by: huangzhuo <huangzhuo1@xiaomi.com> Co-authored-by: lotsik <lotsik@mail.ru> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: gakkiyomi <gakkiyomi@aliyun.com> Co-authored-by: CN-P5 <heibai2006@gmail.com> Co-authored-by: CN-P5 <heibai2006@qq.com> Co-authored-by: Chuehnone <1897025+chuehnone@users.noreply.github.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Kevin9703 <51311316+Kevin9703@users.noreply.github.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: Boris Feld <lothiraldan@gmail.com> Co-authored-by: mbo <himabo@gmail.com> Co-authored-by: mabo <mabo@aeyes.ai> Co-authored-by: Warren Chen <warren.chen830@gmail.com> Co-authored-by: JzoNgKVO <27049666+JzoNgKVO@users.noreply.github.com> Co-authored-by: jiandanfeng <chenjh3@wangsu.com> Co-authored-by: zhu-an <70234959+xhdd123321@users.noreply.github.com> Co-authored-by: zhaoqingyu.1075 <zhaoqingyu.1075@bytedance.com> Co-authored-by: 海狸大師 <86974027+yenslife@users.noreply.github.com> Co-authored-by: Xu Song <xusong.vip@gmail.com> Co-authored-by: rayshaw001 <396301947@163.com> Co-authored-by: Ding Jiatong <dingjiatong@gmail.com> Co-authored-by: Bowen Liang <liangbowen@gf.com.cn> Co-authored-by: JasonVV <jasonwangiii@outlook.com> Co-authored-by: le0zh <newlight@qq.com> Co-authored-by: zhuxinliang <zhuxinliang@didiglobal.com> Co-authored-by: k-zaku <zaku99@outlook.jp> Co-authored-by: luckylhb90 <luckylhb90@gmail.com> Co-authored-by: hobo.l <hobo.l@binance.com> Co-authored-by: jiangbo721 <365065261@qq.com> Co-authored-by: 刘江波 <jiangbo721@163.com> Co-authored-by: Shun Miyazawa <34241526+miya@users.noreply.github.com> Co-authored-by: EricPan <30651140+Egfly@users.noreply.github.com> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: sino <sino2322@gmail.com> Co-authored-by: Jhvcc <37662342+Jhvcc@users.noreply.github.com> Co-authored-by: lowell <lowell.hu@zkteco.in> Co-authored-by: Boris Polonsky <BorisPolonsky@users.noreply.github.com> Co-authored-by: Ademílson Tonato <ademilsonft@outlook.com> Co-authored-by: Ademílson Tonato <ademilson.tonato@refurbed.com> Co-authored-by: IWAI, Masaharu <iwaim.sub@gmail.com> Co-authored-by: Yueh-Po Peng (Yabi) <94939112+y10ab1@users.noreply.github.com> Co-authored-by: Jason <ggbbddjm@gmail.com> Co-authored-by: Xin Zhang <sjhpzx@gmail.com> Co-authored-by: yjc980121 <3898524+yjc980121@users.noreply.github.com> Co-authored-by: heyszt <36215648+hieheihei@users.noreply.github.com> Co-authored-by: Abdullah AlOsaimi <osaimiacc@gmail.com> Co-authored-by: Abdullah AlOsaimi <189027247+osaimi@users.noreply.github.com> Co-authored-by: Yingchun Lai <laiyingchun@apache.org> Co-authored-by: Hash Brown <hi@xzd.me> Co-authored-by: zuodongxu <192560071+zuodongxu@users.noreply.github.com> Co-authored-by: Masashi Tomooka <tmokmss@users.noreply.github.com> Co-authored-by: aplio <ryo.091219@gmail.com> Co-authored-by: Obada Khalili <54270856+obadakhalili@users.noreply.github.com> Co-authored-by: Nam Vu <zuzoovn@gmail.com> Co-authored-by: Kei YAMAZAKI <1715090+kei-yamazaki@users.noreply.github.com> Co-authored-by: TechnoHouse <13776377+deephbz@users.noreply.github.com> Co-authored-by: Riddhimaan-Senapati <114703025+Riddhimaan-Senapati@users.noreply.github.com> Co-authored-by: MaFee921 <31881301+2284730142@users.noreply.github.com> Co-authored-by: te-chan <t-nakanome@sakura-is.co.jp> Co-authored-by: HQidea <HQidea@users.noreply.github.com> Co-authored-by: Joshbly <36315710+Joshbly@users.noreply.github.com> Co-authored-by: xhe <xw897002528@gmail.com> Co-authored-by: weiwenyan-dev <154779315+weiwenyan-dev@users.noreply.github.com> Co-authored-by: ex_wenyan.wei <ex_wenyan.wei@tcl.com> Co-authored-by: engchina <12236799+engchina@users.noreply.github.com> Co-authored-by: engchina <atjapan2015@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: 呆萌闷油瓶 <253605712@qq.com> Co-authored-by: Kemal <kemalmeler@outlook.com> Co-authored-by: Lazy_Frog <4590648+lazyFrogLOL@users.noreply.github.com> Co-authored-by: Yi Xiao <54782454+YIXIAO0@users.noreply.github.com> Co-authored-by: Steven sun <98230804+Tuyohai@users.noreply.github.com> Co-authored-by: steven <sunzwj@digitalchina.com> Co-authored-by: Kalo Chin <91766386+fdb02983rhy@users.noreply.github.com> Co-authored-by: Katy Tao <34019945+KatyTao@users.noreply.github.com> Co-authored-by: depy <42985524+h4ckdepy@users.noreply.github.com> Co-authored-by: 胡春东 <gycm520@gmail.com> Co-authored-by: Junjie.M <118170653@qq.com> Co-authored-by: MuYu <mr.muzea@gmail.com> Co-authored-by: Naoki Takashima <39912547+takatea@users.noreply.github.com> Co-authored-by: Summer-Gu <37869445+gubinjie@users.noreply.github.com> Co-authored-by: Fei He <droxer.he@gmail.com> Co-authored-by: ybalbert001 <120714773+ybalbert001@users.noreply.github.com> Co-authored-by: Yuanbo Li <ybalbert@amazon.com> Co-authored-by: douxc <7553076+douxc@users.noreply.github.com> Co-authored-by: liuzhenghua <1090179900@qq.com> Co-authored-by: Wu Jiayang <62842862+Wu-Jiayang@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: kimjion <45935338+kimjion@users.noreply.github.com> Co-authored-by: AugNSo <song.tiankai@icloud.com> Co-authored-by: llinvokerl <38915183+llinvokerl@users.noreply.github.com> Co-authored-by: liusurong.lsr <liusurong.lsr@alibaba-inc.com> Co-authored-by: Vasu Negi <vasu-negi@users.noreply.github.com> Co-authored-by: Hundredwz <1808096180@qq.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com>
		
			
				
	
	
		
			165 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
'use client'
 | 
						|
import type { FC } from 'react'
 | 
						|
import React, { useMemo } from 'react'
 | 
						|
import { useTranslation } from 'react-i18next'
 | 
						|
import {
 | 
						|
  RiArrowLeftLine,
 | 
						|
  RiCloseLine,
 | 
						|
} from '@remixicon/react'
 | 
						|
import Drawer from '@/app/components/base/drawer'
 | 
						|
import ActionButton from '@/app/components/base/action-button'
 | 
						|
import Icon from '@/app/components/plugins/card/base/card-icon'
 | 
						|
import Description from '@/app/components/plugins/card/base/description'
 | 
						|
import Divider from '@/app/components/base/divider'
 | 
						|
import type {
 | 
						|
  StrategyDetail,
 | 
						|
} from '@/app/components/plugins/types'
 | 
						|
import type { Locale } from '@/i18n'
 | 
						|
import { useRenderI18nObject } from '@/hooks/use-i18n'
 | 
						|
import { API_PREFIX } from '@/config'
 | 
						|
import cn from '@/utils/classnames'
 | 
						|
 | 
						|
type Props = {
 | 
						|
  provider: {
 | 
						|
    author: string
 | 
						|
    name: string
 | 
						|
    description: Record<Locale, string>
 | 
						|
    tenant_id: string
 | 
						|
    icon: string
 | 
						|
    label: Record<Locale, string>
 | 
						|
    tags: string[]
 | 
						|
  }
 | 
						|
  detail: StrategyDetail
 | 
						|
  onHide: () => void
 | 
						|
}
 | 
						|
 | 
						|
const StrategyDetail: FC<Props> = ({
 | 
						|
  provider,
 | 
						|
  detail,
 | 
						|
  onHide,
 | 
						|
}) => {
 | 
						|
  const getValueFromI18nObject = useRenderI18nObject()
 | 
						|
  const { t } = useTranslation()
 | 
						|
 | 
						|
  const outputSchema = useMemo(() => {
 | 
						|
    const res: any[] = []
 | 
						|
    if (!detail.output_schema)
 | 
						|
      return []
 | 
						|
    Object.keys(detail.output_schema.properties).forEach((outputKey) => {
 | 
						|
      const output = detail.output_schema.properties[outputKey]
 | 
						|
      res.push({
 | 
						|
        name: outputKey,
 | 
						|
        type: output.type === 'array'
 | 
						|
          ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]`
 | 
						|
          : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}`,
 | 
						|
        description: output.description,
 | 
						|
      })
 | 
						|
    })
 | 
						|
    return res
 | 
						|
  }, [detail.output_schema])
 | 
						|
 | 
						|
  const getType = (type: string) => {
 | 
						|
    if (type === 'number-input')
 | 
						|
      return t('tools.setBuiltInTools.number')
 | 
						|
    if (type === 'text-input')
 | 
						|
      return t('tools.setBuiltInTools.string')
 | 
						|
    if (type === 'file')
 | 
						|
      return t('tools.setBuiltInTools.file')
 | 
						|
    if (type === 'array[tools]')
 | 
						|
      return 'multiple-tool-select'
 | 
						|
    return type
 | 
						|
  }
 | 
						|
 | 
						|
  return (
 | 
						|
    <Drawer
 | 
						|
      isOpen
 | 
						|
      clickOutsideNotOpen={false}
 | 
						|
      onClose={onHide}
 | 
						|
      footer={null}
 | 
						|
      mask={false}
 | 
						|
      positionCenter={false}
 | 
						|
      panelClassname={cn('justify-start mt-[64px] mr-2 mb-2 !w-[420px] !max-w-[420px] !p-0 !bg-components-panel-bg rounded-2xl border-[0.5px] border-components-panel-border shadow-xl')}
 | 
						|
    >
 | 
						|
      <>
 | 
						|
        {/* header */}
 | 
						|
        <div className='relative p-4 pb-3 border-b border-divider-subtle'>
 | 
						|
          <div className='absolute top-3 right-3'>
 | 
						|
            <ActionButton onClick={onHide}>
 | 
						|
              <RiCloseLine className='w-4 h-4' />
 | 
						|
            </ActionButton>
 | 
						|
          </div>
 | 
						|
          <div
 | 
						|
            className='mb-2 flex items-center gap-1 text-text-accent-secondary system-xs-semibold-uppercase cursor-pointer'
 | 
						|
            onClick={onHide}
 | 
						|
          >
 | 
						|
            <RiArrowLeftLine className='w-4 h-4' />
 | 
						|
            BACK
 | 
						|
          </div>
 | 
						|
          <div className='flex items-center gap-1'>
 | 
						|
            <Icon size='tiny' className='w-6 h-6' src={`${API_PREFIX}/workspaces/current/plugin/icon?tenant_id=${provider.tenant_id}&filename=${provider.icon}`} />
 | 
						|
            <div className=''>{getValueFromI18nObject(provider.label)}</div>
 | 
						|
          </div>
 | 
						|
          <div className='mt-1 text-text-primary system-md-semibold'>{getValueFromI18nObject(detail.identity.label)}</div>
 | 
						|
          <Description className='mt-3' text={getValueFromI18nObject(detail.description)} descriptionLineRows={2}></Description>
 | 
						|
        </div>
 | 
						|
        {/* form */}
 | 
						|
        <div className='h-full'>
 | 
						|
          <div className='flex flex-col h-full overflow-y-auto'>
 | 
						|
            <div className='p-4 pb-1 text-text-primary system-sm-semibold-uppercase'>{t('tools.setBuiltInTools.parameters')}</div>
 | 
						|
            <div className='px-4'>
 | 
						|
              {detail.parameters.length > 0 && (
 | 
						|
                <div className='py-2 space-y-1'>
 | 
						|
                  {detail.parameters.map((item: any, index) => (
 | 
						|
                    <div key={index} className='py-1'>
 | 
						|
                      <div className='flex items-center gap-2'>
 | 
						|
                        <div className='text-text-secondary code-sm-semibold'>{getValueFromI18nObject(item.label)}</div>
 | 
						|
                        <div className='text-text-tertiary system-xs-regular'>
 | 
						|
                          {getType(item.type)}
 | 
						|
                        </div>
 | 
						|
                        {item.required && (
 | 
						|
                          <div className='text-text-warning-secondary system-xs-medium'>{t('tools.setBuiltInTools.required')}</div>
 | 
						|
                        )}
 | 
						|
                      </div>
 | 
						|
                      {item.human_description && (
 | 
						|
                        <div className='mt-0.5 text-text-tertiary system-xs-regular'>
 | 
						|
                          {getValueFromI18nObject(item.human_description)}
 | 
						|
                        </div>
 | 
						|
                      )}
 | 
						|
                    </div>
 | 
						|
                  ))}
 | 
						|
                </div>
 | 
						|
              )}
 | 
						|
            </div>
 | 
						|
            {detail.output_schema && (
 | 
						|
              <>
 | 
						|
                <div className='px-4'>
 | 
						|
                  <Divider className="!mt-2" />
 | 
						|
                </div>
 | 
						|
                <div className='p-4 pb-1 text-text-primary system-sm-semibold-uppercase'>OUTPUT</div>
 | 
						|
                {outputSchema.length > 0 && (
 | 
						|
                  <div className='px-4 py-2 space-y-1'>
 | 
						|
                    {outputSchema.map((outputItem, index) => (
 | 
						|
                      <div key={index} className='py-1'>
 | 
						|
                        <div className='flex items-center gap-2'>
 | 
						|
                          <div className='text-text-secondary code-sm-semibold'>{outputItem.name}</div>
 | 
						|
                          <div className='text-text-tertiary system-xs-regular'>{outputItem.type}</div>
 | 
						|
                        </div>
 | 
						|
                        {outputItem.description && (
 | 
						|
                          <div className='mt-0.5 text-text-tertiary system-xs-regular'>
 | 
						|
                            {outputItem.description}
 | 
						|
                          </div>
 | 
						|
                        )}
 | 
						|
                      </div>
 | 
						|
                    ))}
 | 
						|
                  </div>
 | 
						|
                )}
 | 
						|
              </>
 | 
						|
            )}
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
      </>
 | 
						|
    </Drawer>
 | 
						|
  )
 | 
						|
}
 | 
						|
export default StrategyDetail
 |