result.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. 'use client'
  2. import type { FC } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import StatusPanel from '@/app/components/workflow/run/status'
  5. import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
  6. import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
  7. import useTimestamp from '@/hooks/use-timestamp'
  8. type ResultPanelProps = {
  9. status: string
  10. elapsed_time?: number
  11. total_tokens?: number
  12. error?: string
  13. inputs?: any
  14. outputs?: any
  15. created_by?: string
  16. created_at: string
  17. agentMode?: string
  18. tools?: string[]
  19. iterations?: number
  20. }
  21. const ResultPanel: FC<ResultPanelProps> = ({
  22. status,
  23. elapsed_time,
  24. total_tokens,
  25. error,
  26. inputs,
  27. outputs,
  28. created_by,
  29. created_at,
  30. agentMode,
  31. tools,
  32. iterations,
  33. }) => {
  34. const { t } = useTranslation()
  35. const { formatTime } = useTimestamp()
  36. return (
  37. <div className='bg-white py-2'>
  38. <div className='px-4 py-2'>
  39. <StatusPanel
  40. status='succeeded'
  41. time={elapsed_time}
  42. tokens={total_tokens}
  43. error={error}
  44. />
  45. </div>
  46. <div className='px-4 py-2 flex flex-col gap-2'>
  47. <CodeEditor
  48. readOnly
  49. title={<div>INPUT</div>}
  50. language={CodeLanguage.json}
  51. value={inputs}
  52. isJSONStringifyBeauty
  53. />
  54. <CodeEditor
  55. readOnly
  56. title={<div>OUTPUT</div>}
  57. language={CodeLanguage.json}
  58. value={outputs}
  59. isJSONStringifyBeauty
  60. />
  61. </div>
  62. <div className='px-4 py-2'>
  63. <div className='h-[0.5px] bg-black opacity-5' />
  64. </div>
  65. <div className='px-4 py-2'>
  66. <div className='relative'>
  67. <div className='h-6 leading-6 text-gray-500 text-xs font-medium'>{t('runLog.meta.title')}</div>
  68. <div className='py-1'>
  69. <div className='flex'>
  70. <div className='shrink-0 w-[104px] px-2 py-[5px] text-gray-500 text-xs leading-[18px] truncate'>{t('runLog.meta.status')}</div>
  71. <div className='grow px-2 py-[5px] text-gray-900 text-xs leading-[18px]'>
  72. <span>SUCCESS</span>
  73. </div>
  74. </div>
  75. <div className='flex'>
  76. <div className='shrink-0 w-[104px] px-2 py-[5px] text-gray-500 text-xs leading-[18px] truncate'>{t('runLog.meta.executor')}</div>
  77. <div className='grow px-2 py-[5px] text-gray-900 text-xs leading-[18px]'>
  78. <span>{created_by || 'N/A'}</span>
  79. </div>
  80. </div>
  81. <div className='flex'>
  82. <div className='shrink-0 w-[104px] px-2 py-[5px] text-gray-500 text-xs leading-[18px] truncate'>{t('runLog.meta.startTime')}</div>
  83. <div className='grow px-2 py-[5px] text-gray-900 text-xs leading-[18px]'>
  84. <span>{formatTime(Date.parse(created_at) / 1000, t('appLog.dateTimeFormat') as string)}</span>
  85. </div>
  86. </div>
  87. <div className='flex'>
  88. <div className='shrink-0 w-[104px] px-2 py-[5px] text-gray-500 text-xs leading-[18px] truncate'>{t('runLog.meta.time')}</div>
  89. <div className='grow px-2 py-[5px] text-gray-900 text-xs leading-[18px]'>
  90. <span>{`${elapsed_time?.toFixed(3)}s`}</span>
  91. </div>
  92. </div>
  93. <div className='flex'>
  94. <div className='shrink-0 w-[104px] px-2 py-[5px] text-gray-500 text-xs leading-[18px] truncate'>{t('runLog.meta.tokens')}</div>
  95. <div className='grow px-2 py-[5px] text-gray-900 text-xs leading-[18px]'>
  96. <span>{`${total_tokens || 0} Tokens`}</span>
  97. </div>
  98. </div>
  99. <div className='flex'>
  100. <div className='shrink-0 w-[104px] px-2 py-[5px] text-gray-500 text-xs leading-[18px] truncate'>{t('appLog.agentLogDetail.agentMode')}</div>
  101. <div className='grow px-2 py-[5px] text-gray-900 text-xs leading-[18px]'>
  102. <span>{agentMode === 'function_call' ? t('appDebug.agent.agentModeType.functionCall') : t('appDebug.agent.agentModeType.ReACT')}</span>
  103. </div>
  104. </div>
  105. <div className='flex'>
  106. <div className='shrink-0 w-[104px] px-2 py-[5px] text-gray-500 text-xs leading-[18px] truncate'>{t('appLog.agentLogDetail.toolUsed')}</div>
  107. <div className='grow px-2 py-[5px] text-gray-900 text-xs leading-[18px]'>
  108. <span>{tools?.length ? tools?.join(', ') : 'Null'}</span>
  109. </div>
  110. </div>
  111. <div className='flex'>
  112. <div className='shrink-0 w-[104px] px-2 py-[5px] text-gray-500 text-xs leading-[18px] truncate'>{t('appLog.agentLogDetail.iterations')}</div>
  113. <div className='grow px-2 py-[5px] text-gray-900 text-xs leading-[18px]'>
  114. <span>{iterations}</span>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. )
  122. }
  123. export default ResultPanel