1
1
/**
2
- * This script requires the use of k6 docker image version
2
+ * This script requires the use of k6 docker image and it needs to be run inside the docker container. Check the command below
3
+ * The k6 modules are imported from within the docker container. So it is not a dependency in Currechat
3
4
*
4
- * run using: docker run --rm -i grafana/k6 run - <script .js
5
+ * run using: docker run --rm -i grafana/k6 run - <scripts/k6_load_test .js
5
6
*/
6
7
7
8
import http from 'k6/http'
@@ -10,39 +11,29 @@ import { sleep, check } from 'k6'
10
11
const staging = 'http://gptwrapper.toska.svc.cluster.local:8000/api/ai/stream'
11
12
const local = 'http://172.17.0.1:3000/api//ai/stream'
12
13
14
+ // k6 will pickup the options object internally.
13
15
const vusit = 50
14
-
15
16
export const options = {
16
17
vus : vusit ,
17
18
iterations : vusit ,
18
- // duration: "1s",
19
19
}
20
20
21
- const messages = [
22
- 'listaa viisi numeroa' ,
23
- 'listaa viisi väriä' ,
24
- 'listaa viisi esinettä' ,
25
- 'listaa viisi makua' ,
26
- 'listaa viisi huonekalua' ,
27
- 'listaa viisi presidenttiä' ,
28
- 'listaa viisi maata' ,
29
- 'listaa viisi ohjelmointikieltä' ,
30
- 'listaa viisi kaupunkia' ,
31
- 'listaa viisi vaatemerkkiä' ,
32
- 'listaa viisi urheilulajia' ,
33
- ]
21
+ const headers = {
22
+ headers : {
23
+ 'Content-Type' : 'application/json' ,
24
+ uid : 'testUser' ,
25
+
26
+ preferredlanguage : 'fi' ,
27
+ hypersonsisuid : 'hy-hlo-123' ,
28
+ hygroupcn : 'grp-toska;hy-employees;grp-currechat-demostudents;grp-currechat-demoteachers' ,
29
+ } ,
30
+ }
34
31
35
32
const data = {
36
33
options : {
37
- messages : [
38
- { role : 'system' , content : 'Olet avulias avustaja' } ,
39
- {
40
- role : 'user' ,
41
- content : undefined , // will be substituted from messages list
42
- } ,
43
- ] ,
34
+ messages : [ ] ,
44
35
assistantInstructions : 'Olet avulias avustaja' ,
45
- model : 'mock ' ,
36
+ model : 'gpt-4o-mini ' ,
46
37
modelTemperature : 0.5 ,
47
38
saveConsent : false ,
48
39
prevResponseId : '' ,
@@ -51,50 +42,52 @@ const data = {
51
42
courseId : 'sandbox' ,
52
43
}
53
44
54
- function tokensToText ( tokenizedStr ) {
55
- return tokenizedStr
45
+ const messages = [ 'listaa viisi esinettä' , 'kerro niistä jotain' , 'anna esimerkki jokaisesta esineestä' , 'kerro yksityiskohtaisemmin' , 'tiivistä kertomasi' ]
46
+
47
+ function handleTokens ( tokenizedStr ) {
48
+ let texts = [ ]
49
+ let responseId = ''
50
+
51
+ tokenizedStr
56
52
. split ( '\n' )
57
53
. filter ( Boolean )
58
- . map ( ( line ) => {
54
+ . forEach ( ( line ) => {
59
55
try {
60
- return JSON . parse ( line ) . text
56
+ const parsedLine = JSON . parse ( line )
57
+ if ( parsedLine . text ) texts . push ( parsedLine . text )
58
+ if ( parsedLine . prevResponseId ) responseId = parsedLine . prevResponseId
61
59
} catch {
62
- return ''
60
+ console . log ( '📌 error parsing line' )
63
61
}
64
62
} )
63
+
64
+ const response = texts
65
65
. join ( '' )
66
+ . replace ( / \n + / g, ' ' )
67
+ . replace ( / \s { 2 , } / g, ' ' )
68
+ . trim ( )
69
+
70
+ return { response, responseId }
66
71
}
67
72
68
73
export default function ( ) {
69
74
const url = `${ staging } /v2`
75
+ let prevResponseId = ''
70
76
71
77
for ( const message of messages ) {
72
- const dataCopy = { ...data }
73
- dataCopy . options . messages = [
74
- { role : 'system' , content : 'Olet load testissä' } ,
75
- {
76
- role : 'user' ,
77
- content : message ,
78
- } ,
79
- ]
80
- const updatedData = dataCopy
78
+ const newData = { ...data }
79
+ newData . options . messages = [ { role : 'user' , content : message } ]
80
+ newData . options . prevResponseId = prevResponseId
81
81
82
82
const payload = JSON . stringify ( {
83
- data : JSON . stringify ( updatedData ) ,
83
+ data : JSON . stringify ( newData ) ,
84
84
} )
85
- const params = {
86
- headers : {
87
- 'Content-Type' : 'application/json' ,
88
- uid : 'testUser' ,
89
-
90
- preferredlanguage : 'fi' ,
91
- hypersonsisuid : 'hy-hlo-123' ,
92
- hygroupcn : 'grp-toska;hy-employees;grp-currechat-demostudents;grp-currechat-demoteachers' ,
93
- } ,
94
- }
95
85
96
- let res = http . post ( url , payload , params )
97
- console . log ( '📌' , tokensToText ( res . body ) )
86
+ let res = http . post ( url , payload , headers )
87
+ const { response, responseId } = handleTokens ( res . body )
88
+ prevResponseId = responseId
89
+
90
+ console . log ( '📌 response:' , response )
98
91
check ( res , { 'status is 200' : ( res ) => res . status === 200 } )
99
92
sleep ( 5 )
100
93
}
0 commit comments