'use client' import type { FC, JSX } from 'react' import type { AliyunConfig, ArizeConfig, DatabricksConfig, LangFuseConfig, LangSmithConfig, MLflowConfig, OpikConfig, PhoenixConfig, TencentConfig, WeaveConfig } from './type' import { useBoolean } from 'ahooks' import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import Divider from '@/app/components/base/divider' import Switch from '@/app/components/base/switch' import Tooltip from '@/app/components/base/tooltip' import Indicator from '@/app/components/header/indicator' import { cn } from '@/utils/classnames' import ProviderConfigModal from './provider-config-modal' import ProviderPanel from './provider-panel' import TracingIcon from './tracing-icon' import { TracingProvider } from './type' const I18N_PREFIX = 'app.tracing' export type PopupProps = { appId: string readOnly: boolean enabled: boolean onStatusChange: (enabled: boolean) => void chosenProvider: TracingProvider | null onChooseProvider: (provider: TracingProvider) => void arizeConfig: ArizeConfig | null phoenixConfig: PhoenixConfig | null langSmithConfig: LangSmithConfig | null langFuseConfig: LangFuseConfig | null opikConfig: OpikConfig | null weaveConfig: WeaveConfig | null aliyunConfig: AliyunConfig | null mlflowConfig: MLflowConfig | null databricksConfig: DatabricksConfig | null tencentConfig: TencentConfig | null onConfigUpdated: (provider: TracingProvider, payload: ArizeConfig | PhoenixConfig | LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig | AliyunConfig | TencentConfig | MLflowConfig | DatabricksConfig) => void onConfigRemoved: (provider: TracingProvider) => void } const ConfigPopup: FC = ({ appId, readOnly, enabled, onStatusChange, chosenProvider, onChooseProvider, arizeConfig, phoenixConfig, langSmithConfig, langFuseConfig, opikConfig, weaveConfig, aliyunConfig, mlflowConfig, databricksConfig, tencentConfig, onConfigUpdated, onConfigRemoved, }) => { const { t } = useTranslation() const [currentProvider, setCurrentProvider] = useState(TracingProvider.langfuse) const [isShowConfigModal, { setTrue: showConfigModal, setFalse: hideConfigModal, }] = useBoolean(false) const handleOnConfig = useCallback((provider: TracingProvider) => { return () => { setCurrentProvider(provider) showConfigModal() } }, [showConfigModal]) const handleOnChoose = useCallback((provider: TracingProvider) => { return () => { onChooseProvider(provider) } }, [onChooseProvider]) const handleConfigUpdated = useCallback((payload: ArizeConfig | PhoenixConfig | LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig | AliyunConfig | MLflowConfig | DatabricksConfig | TencentConfig) => { onConfigUpdated(currentProvider!, payload) hideConfigModal() }, [currentProvider, hideConfigModal, onConfigUpdated]) const handleConfigRemoved = useCallback(() => { onConfigRemoved(currentProvider!) hideConfigModal() }, [currentProvider, hideConfigModal, onConfigRemoved]) const providerAllConfigured = arizeConfig && phoenixConfig && langSmithConfig && langFuseConfig && opikConfig && weaveConfig && aliyunConfig && mlflowConfig && databricksConfig && tencentConfig const providerAllNotConfigured = !arizeConfig && !phoenixConfig && !langSmithConfig && !langFuseConfig && !opikConfig && !weaveConfig && !aliyunConfig && !mlflowConfig && !databricksConfig && !tencentConfig const switchContent = ( ) const arizePanel = ( ) const phoenixPanel = ( ) const langSmithPanel = ( ) const langfusePanel = ( ) const opikPanel = ( ) const weavePanel = ( ) const aliyunPanel = ( ) const mlflowPanel = ( ) const databricksPanel = ( ) const tencentPanel = ( ) const configuredProviderPanel = () => { const configuredPanels: JSX.Element[] = [] if (langFuseConfig) configuredPanels.push(langfusePanel) if (langSmithConfig) configuredPanels.push(langSmithPanel) if (opikConfig) configuredPanels.push(opikPanel) if (weaveConfig) configuredPanels.push(weavePanel) if (arizeConfig) configuredPanels.push(arizePanel) if (phoenixConfig) configuredPanels.push(phoenixPanel) if (aliyunConfig) configuredPanels.push(aliyunPanel) if (mlflowConfig) configuredPanels.push(mlflowPanel) if (databricksConfig) configuredPanels.push(databricksPanel) if (tencentConfig) configuredPanels.push(tencentPanel) return configuredPanels } const moreProviderPanel = () => { const notConfiguredPanels: JSX.Element[] = [] if (!arizeConfig) notConfiguredPanels.push(arizePanel) if (!phoenixConfig) notConfiguredPanels.push(phoenixPanel) if (!langFuseConfig) notConfiguredPanels.push(langfusePanel) if (!langSmithConfig) notConfiguredPanels.push(langSmithPanel) if (!opikConfig) notConfiguredPanels.push(opikPanel) if (!weaveConfig) notConfiguredPanels.push(weavePanel) if (!aliyunConfig) notConfiguredPanels.push(aliyunPanel) if (!mlflowConfig) notConfiguredPanels.push(mlflowPanel) if (!databricksConfig) notConfiguredPanels.push(databricksPanel) if (!tencentConfig) notConfiguredPanels.push(tencentPanel) return notConfiguredPanels } const configuredProviderConfig = () => { if (currentProvider === TracingProvider.mlflow) return mlflowConfig if (currentProvider === TracingProvider.databricks) return databricksConfig if (currentProvider === TracingProvider.arize) return arizeConfig if (currentProvider === TracingProvider.phoenix) return phoenixConfig if (currentProvider === TracingProvider.langSmith) return langSmithConfig if (currentProvider === TracingProvider.langfuse) return langFuseConfig if (currentProvider === TracingProvider.opik) return opikConfig if (currentProvider === TracingProvider.aliyun) return aliyunConfig if (currentProvider === TracingProvider.tencent) return tencentConfig return weaveConfig } return (
{t(`${I18N_PREFIX}.tracing`)}
{t(`${I18N_PREFIX}.${enabled ? 'enabled' : 'disabled'}`)}
{!readOnly && ( <> {providerAllNotConfigured ? ( {switchContent} ) : switchContent} )}
{t(`${I18N_PREFIX}.tracingDescription`)}
{(providerAllConfigured || providerAllNotConfigured) ? ( <>
{t(`${I18N_PREFIX}.configProviderTitle.${providerAllConfigured ? 'configured' : 'notConfigured'}`)}
{langfusePanel} {langSmithPanel} {opikPanel} {mlflowPanel} {databricksPanel} {weavePanel} {arizePanel} {phoenixPanel} {aliyunPanel} {tencentPanel}
) : ( <>
{t(`${I18N_PREFIX}.configProviderTitle.configured`)}
{configuredProviderPanel()}
{t(`${I18N_PREFIX}.configProviderTitle.moreProvider`)}
{moreProviderPanel()}
)}
{isShowConfigModal && ( )}
) } export default React.memo(ConfigPopup)