feat: enhance workflow log components with detailed trigger metadata and type safety

This commit is contained in:
zhsama 2025-11-06 16:16:34 +08:00
parent 9d7b47c784
commit 85a5c78b80
4 changed files with 68 additions and 11 deletions

View File

@ -41,6 +41,7 @@ const Logs: FC<ILogsProps> = ({ appDetail }) => {
const query = {
page: currPage + 1,
detail: true,
limit,
...(debouncedQueryParams.status !== 'all' ? { status: debouncedQueryParams.status } : {}),
...(debouncedQueryParams.keyword ? { keyword: debouncedQueryParams.keyword } : {}),

View File

@ -13,6 +13,7 @@ import Indicator from '@/app/components/header/indicator'
import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
import useTimestamp from '@/hooks/use-timestamp'
import cn from '@/utils/classnames'
import type { WorkflowRunTriggeredFrom } from '@/models/log'
type ILogs = {
logs?: WorkflowLogsResponse
@ -162,7 +163,7 @@ const WorkflowAppLogList: FC<ILogs> = ({ logs, appDetail, onRefresh }) => {
</td>
{isWorkflow && (
<td className='p-3 pr-2'>
<TriggerByDisplay triggeredFrom={log.workflow_run.triggered_from || 'app-run'} />
<TriggerByDisplay triggeredFrom={log.workflow_run.triggered_from as WorkflowRunTriggeredFrom} triggerMetadata={log.details?.trigger_metadata} />
</td>
)}
</tr>

View File

@ -11,15 +11,23 @@ import {
} from '@/app/components/base/icons/src/vender/workflow'
import BlockIcon from '@/app/components/workflow/block-icon'
import { BlockEnum } from '@/app/components/workflow/types'
import useTheme from '@/hooks/use-theme'
import type { TriggerMetadata } from '@/models/log'
import { WorkflowRunTriggeredFrom } from '@/models/log'
import { Theme } from '@/types/app'
type TriggerByDisplayProps = {
triggeredFrom: string
triggeredFrom: WorkflowRunTriggeredFrom
className?: string
showText?: boolean
triggerMetadata?: TriggerMetadata
}
const getTriggerDisplayName = (triggeredFrom: string, t: any) => {
const nameMap: Record<string, string> = {
const getTriggerDisplayName = (triggeredFrom: WorkflowRunTriggeredFrom, t: any, metadata?: TriggerMetadata) => {
if (triggeredFrom === WorkflowRunTriggeredFrom.PLUGIN && metadata?.event_name)
return metadata.event_name
const nameMap: Record<WorkflowRunTriggeredFrom, string> = {
'debugging': t('appLog.triggerBy.debugging'),
'app-run': t('appLog.triggerBy.appRun'),
'webhook': t('appLog.triggerBy.webhook'),
@ -32,7 +40,27 @@ const getTriggerDisplayName = (triggeredFrom: string, t: any) => {
return nameMap[triggeredFrom] || triggeredFrom
}
const getTriggerIcon = (triggeredFrom: string) => {
const getPluginIcon = (metadata: TriggerMetadata | undefined, theme: Theme) => {
if (!metadata)
return null
const icon = theme === Theme.dark
? metadata.icon_dark || metadata.icon
: metadata.icon || metadata.icon_dark
if (!icon)
return null
return (
<BlockIcon
type={BlockEnum.TriggerPlugin}
size='md'
toolIcon={icon}
/>
)
}
const getTriggerIcon = (triggeredFrom: WorkflowRunTriggeredFrom, metadata: TriggerMetadata | undefined, theme: Theme) => {
switch (triggeredFrom) {
case 'webhook':
return (
@ -47,9 +75,7 @@ const getTriggerIcon = (triggeredFrom: string) => {
</div>
)
case 'plugin':
// For plugin triggers in logs, use a generic plugin icon since we don't have specific plugin info
// This matches the standard BlockIcon styling for TriggerPlugin
return (
return getPluginIcon(metadata, theme) || (
<BlockIcon
type={BlockEnum.TriggerPlugin}
size="md"
@ -83,11 +109,13 @@ const TriggerByDisplay: FC<TriggerByDisplayProps> = ({
triggeredFrom,
className = '',
showText = true,
triggerMetadata,
}) => {
const { t } = useTranslation()
const { theme } = useTheme()
const displayName = getTriggerDisplayName(triggeredFrom, t)
const icon = getTriggerIcon(triggeredFrom)
const displayName = getTriggerDisplayName(triggeredFrom, t, triggerMetadata)
const icon = getTriggerIcon(triggeredFrom, triggerMetadata, theme)
return (
<div className={`flex items-center gap-1.5 ${className}`}>

View File

@ -229,12 +229,38 @@ export type AnnotationsCountResponse = {
count: number
}
export enum WorkflowRunTriggeredFrom {
DEBUGGING = 'debugging',
APP_RUN = 'app-run',
RAG_PIPELINE_RUN = 'rag-pipeline-run',
RAG_PIPELINE_DEBUGGING = 'rag-pipeline-debugging',
WEBHOOK = 'webhook',
SCHEDULE = 'schedule',
PLUGIN = 'plugin',
}
export type TriggerMetadata = {
type?: string
endpoint_id?: string
plugin_unique_identifier?: string
provider_id?: string
event_name?: string
icon_filename?: string
icon_dark_filename?: string
icon?: string | null
icon_dark?: string | null
}
export type WorkflowLogDetails = {
trigger_metadata?: TriggerMetadata
}
export type WorkflowRunDetail = {
id: string
version: string
status: 'running' | 'succeeded' | 'failed' | 'stopped'
error?: string
triggered_from?: string
triggered_from?: WorkflowRunTriggeredFrom
elapsed_time: number
total_tokens: number
total_price: number
@ -256,6 +282,7 @@ export type EndUserInfo = {
export type WorkflowAppLogDetail = {
id: string
workflow_run: WorkflowRunDetail
details?: WorkflowLogDetails
created_from: 'service-api' | 'web-app' | 'explore'
created_by_role: 'account' | 'end_user'
created_by_account?: AccountInfo