| | |
| | | import { useBoolean } from 'ahooks' |
| | | import TracingIcon from './tracing-icon' |
| | | import ProviderPanel from './provider-panel' |
| | | import type { LangFuseConfig, LangSmithConfig, OpikConfig, WeaveConfig } from './type' |
| | | import type { LangFuseConfig, LangSmithConfig, OpikConfig } from './type' |
| | | import { TracingProvider } from './type' |
| | | import ProviderConfigModal from './provider-config-modal' |
| | | import Indicator from '@/app/components/header/indicator' |
| | | import Switch from '@/app/components/base/switch' |
| | | import Tooltip from '@/app/components/base/tooltip' |
| | | import Divider from '@/app/components/base/divider' |
| | | import cn from '@/utils/classnames' |
| | | |
| | | const I18N_PREFIX = 'app.tracing' |
| | | |
| | |
| | | langSmithConfig: LangSmithConfig | null |
| | | langFuseConfig: LangFuseConfig | null |
| | | opikConfig: OpikConfig | null |
| | | weaveConfig: WeaveConfig | null |
| | | onConfigUpdated: (provider: TracingProvider, payload: LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig) => void |
| | | onConfigUpdated: (provider: TracingProvider, payload: LangSmithConfig | LangFuseConfig | OpikConfig) => void |
| | | onConfigRemoved: (provider: TracingProvider) => void |
| | | } |
| | | |
| | |
| | | langSmithConfig, |
| | | langFuseConfig, |
| | | opikConfig, |
| | | weaveConfig, |
| | | onConfigUpdated, |
| | | onConfigRemoved, |
| | | }) => { |
| | |
| | | } |
| | | }, [onChooseProvider]) |
| | | |
| | | const handleConfigUpdated = useCallback((payload: LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig) => { |
| | | const handleConfigUpdated = useCallback((payload: LangSmithConfig | LangFuseConfig | OpikConfig) => { |
| | | onConfigUpdated(currentProvider!, payload) |
| | | hideConfigModal() |
| | | }, [currentProvider, hideConfigModal, onConfigUpdated]) |
| | |
| | | hideConfigModal() |
| | | }, [currentProvider, hideConfigModal, onConfigRemoved]) |
| | | |
| | | const providerAllConfigured = langSmithConfig && langFuseConfig && opikConfig && weaveConfig |
| | | const providerAllNotConfigured = !langSmithConfig && !langFuseConfig && !opikConfig && !weaveConfig |
| | | const providerAllConfigured = langSmithConfig && langFuseConfig && opikConfig |
| | | const providerAllNotConfigured = !langSmithConfig && !langFuseConfig && !opikConfig |
| | | |
| | | const switchContent = ( |
| | | <Switch |
| | | className='ml-3' |
| | | defaultValue={enabled} |
| | | onChange={onStatusChange} |
| | | size='l' |
| | | disabled={providerAllNotConfigured} |
| | | /> |
| | | ) |
| | |
| | | /> |
| | | ) |
| | | |
| | | const weavePanel = ( |
| | | <ProviderPanel |
| | | type={TracingProvider.weave} |
| | | readOnly={readOnly} |
| | | config={weaveConfig} |
| | | hasConfigured={!!weaveConfig} |
| | | onConfig={handleOnConfig(TracingProvider.weave)} |
| | | isChosen={chosenProvider === TracingProvider.weave} |
| | | onChoose={handleOnChoose(TracingProvider.weave)} |
| | | key="weave-provider-panel" |
| | | /> |
| | | ) |
| | | const configuredProviderPanel = () => { |
| | | const configuredPanels: JSX.Element[] = [] |
| | | |
| | | if (langFuseConfig) |
| | | configuredPanels.push(langfusePanel) |
| | | const configuredPanels: ProviderPanel[] = [] |
| | | |
| | | if (langSmithConfig) |
| | | configuredPanels.push(langSmithPanel) |
| | | |
| | | if (langFuseConfig) |
| | | configuredPanels.push(langfusePanel) |
| | | |
| | | if (opikConfig) |
| | | configuredPanels.push(opikPanel) |
| | | |
| | | if (weaveConfig) |
| | | configuredPanels.push(weavePanel) |
| | | |
| | | return configuredPanels |
| | | } |
| | | |
| | | const moreProviderPanel = () => { |
| | | const notConfiguredPanels: JSX.Element[] = [] |
| | | |
| | | if (!langFuseConfig) |
| | | notConfiguredPanels.push(langfusePanel) |
| | | const notConfiguredPanels: ProviderPanel[] = [] |
| | | |
| | | if (!langSmithConfig) |
| | | notConfiguredPanels.push(langSmithPanel) |
| | | |
| | | if (!langFuseConfig) |
| | | notConfiguredPanels.push(langfusePanel) |
| | | |
| | | if (!opikConfig) |
| | | notConfiguredPanels.push(opikPanel) |
| | | |
| | | if (!weaveConfig) |
| | | notConfiguredPanels.push(weavePanel) |
| | | |
| | | return notConfiguredPanels |
| | | } |
| | |
| | | return langSmithConfig |
| | | if (currentProvider === TracingProvider.langfuse) |
| | | return langFuseConfig |
| | | if (currentProvider === TracingProvider.opik) |
| | | return opikConfig |
| | | return weaveConfig |
| | | return opikConfig |
| | | } |
| | | |
| | | return ( |
| | | <div className='w-[420px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-4 shadow-xl'> |
| | | <div className='flex items-center justify-between'> |
| | | <div className='w-[420px] p-4 rounded-2xl bg-white border-[0.5px] border-black/5 shadow-lg'> |
| | | <div className='flex justify-between items-center'> |
| | | <div className='flex items-center'> |
| | | <TracingIcon size='md' className='mr-2' /> |
| | | <div className='title-2xl-semi-bold text-text-primary'>{t(`${I18N_PREFIX}.tracing`)}</div> |
| | | <div className='leading-[120%] text-[18px] font-semibold text-gray-900'>{t(`${I18N_PREFIX}.tracing`)}</div> |
| | | </div> |
| | | <div className='flex items-center'> |
| | | <Indicator color={enabled ? 'green' : 'gray'} /> |
| | | <div className={cn('system-xs-semibold-uppercase ml-1 text-text-tertiary', enabled && 'text-util-colors-green-green-600')}> |
| | | <div className='ml-1.5 text-xs font-semibold text-gray-500 uppercase'> |
| | | {t(`${I18N_PREFIX}.${enabled ? 'enabled' : 'disabled'}`)} |
| | | </div> |
| | | {!readOnly && ( |
| | |
| | | : switchContent} |
| | | </> |
| | | )} |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | <div className='system-xs-regular mt-2 text-text-tertiary'> |
| | | <div className='mt-2 leading-4 text-xs font-normal text-gray-500'> |
| | | {t(`${I18N_PREFIX}.tracingDescription`)} |
| | | </div> |
| | | <Divider className='my-3' /> |
| | | <div className='relative'> |
| | | <div className='mt-3 h-px bg-gray-100'></div> |
| | | <div className='mt-3'> |
| | | {(providerAllConfigured || providerAllNotConfigured) |
| | | ? ( |
| | | <> |
| | | <div className='system-xs-medium-uppercase text-text-tertiary'>{t(`${I18N_PREFIX}.configProviderTitle.${providerAllConfigured ? 'configured' : 'notConfigured'}`)}</div> |
| | | <div className='leading-4 text-xs font-medium text-gray-500 uppercase'>{t(`${I18N_PREFIX}.configProviderTitle.${providerAllConfigured ? 'configured' : 'notConfigured'}`)}</div> |
| | | <div className='mt-2 space-y-2'> |
| | | {langfusePanel} |
| | | {langSmithPanel} |
| | | {langfusePanel} |
| | | {opikPanel} |
| | | {weavePanel} |
| | | </div> |
| | | </> |
| | | ) |
| | | : ( |
| | | <> |
| | | <div className='system-xs-medium-uppercase text-text-tertiary'>{t(`${I18N_PREFIX}.configProviderTitle.configured`)}</div> |
| | | <div className='leading-4 text-xs font-medium text-gray-500 uppercase'>{t(`${I18N_PREFIX}.configProviderTitle.configured`)}</div> |
| | | <div className='mt-2 space-y-2'> |
| | | {configuredProviderPanel()} |
| | | </div> |
| | | <div className='system-xs-medium-uppercase mt-3 text-text-tertiary'>{t(`${I18N_PREFIX}.configProviderTitle.moreProvider`)}</div> |
| | | <div className='mt-3 leading-4 text-xs font-medium text-gray-500 uppercase'>{t(`${I18N_PREFIX}.configProviderTitle.moreProvider`)}</div> |
| | | <div className='mt-2 space-y-2'> |
| | | {moreProviderPanel()} |
| | | </div> |