instrument-web.py 1.2 KB

123456789101112131415161718192021
  1. from pathlib import Path
  2. import sys
  3. r=Path(sys.argv[1] if len(sys.argv)>1 else '/tmp/bot-latency-acceptance')
  4. probe='''
  5. const latencyTrace: Array<{ time: number; name: string; detail: string }> = []
  6. ;(window as any).__botLatency = latencyTrace
  7. const recordLatency = (name: string, detail = '') => latencyTrace.push({ time: Date.now() / 1000, name, detail })
  8. watch(busy, value => recordLatency(value ? 'send_start' : 'send_ready'), { flush: 'post' })
  9. watch(() => messages.value.at(-1)?.content, () => {
  10. const m = messages.value.at(-1); recordLatency('view_text', `${m?.role}|${m?.status}|${m?.content.length ?? 0}`)
  11. }, { flush: 'post' })
  12. watch(() => messages.value.at(-1)?.status, status => {
  13. const m = messages.value.at(-1); if (status === 'complete' && m?.role === 'assistant') recordLatency('completed_text', m.content)
  14. }, { flush: 'post' })
  15. '''
  16. for mode in ['baseline','optimized']:
  17. repo=r/f'{mode}-server'
  18. assert not (repo/'.git').exists(), 'Use a disposable source copy'
  19. p=repo/'src/client/views/ConversationsView.vue';s=p.read_text()
  20. assert '__botLatency' not in s, 'Copy is already instrumented'
  21. s=s.replace('onMounted(async () => {',probe+'\nonMounted(async () => {',1);p.write_text(s)