File size: 2,313 Bytes
d47b053
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { createLogger } from '../../utils/logger'

const logger = createLogger('PlotStudioTiming')
const IMPORTANT_PLOT_STUDIO_EVENTS = new Set([
  'tool.completed',
  'tool.failed',
])

const PLOT_STUDIO_EVENT_LABELS: Record<string, string> = {
  'http.run.requested': '绘图工作室:收到运行请求',
  'http.run.accepted': '绘图工作室:运行请求已接受',
  'provider.completed': '绘图工作室:模型请求完成',
  'provider.failed': '绘图工作室:模型请求失败',
  'step.started': '绘图工作室:模型步骤开始',
  'step.response': '绘图工作室:模型步骤返回',
  'step.finished': '绘图工作室:模型步骤结束',
  'run.started': '绘图工作室:运行开始',
  'run.completed': '绘图工作室:运行完成',
  'run.failed': '绘图工作室:运行失败',
  'loop.started': '绘图工作室:进入工具循环',
  'assistant.text': '绘图工作室:助手文本已写入',
  'tool.started': '绘图工作室:工具开始执行',
  'tool.completed': '绘图工作室:工具执行成功',
  'tool.failed': '绘图工作室:工具执行失败',
  'events.client.connected': '绘图工作室:前端事件流已连接',
  'events.client.disconnected': '绘图工作室:前端事件流已断开',
}

export function isPlotStudioKind(studioKind?: string | null): boolean {
  return studioKind === 'plot'
}

export function logPlotStudioTiming(
  studioKind: string | null | undefined,
  event: string,
  data: Record<string, unknown>,
  level: 'info' | 'warn' = 'info'
): void {
  if (!isPlotStudioKind(studioKind)) {
    return
  }
  if (!IMPORTANT_PLOT_STUDIO_EVENTS.has(event)) {
    return
  }

  logger[level](toChinesePlotStudioEventLabel(event), {
    事件代码: event,
    ...data,
  })
}

export function readElapsedMs(startedAt: number): number {
  return Math.max(0, Date.now() - startedAt)
}

export function readRunElapsedMs(run: { createdAt?: string }): number | null {
  if (!run.createdAt) {
    return null
  }

  const createdAt = new Date(run.createdAt).getTime()
  if (!Number.isFinite(createdAt)) {
    return null
  }

  return Math.max(0, Date.now() - createdAt)
}

function toChinesePlotStudioEventLabel(event: string): string {
  return PLOT_STUDIO_EVENT_LABELS[event] ?? `绘图工作室:${event}`
}