Miguel Diaz commited on
Commit
42d365f
1 Parent(s): f279b13

dev: corrección reenviar en error

Browse files
Files changed (1) hide show
  1. static/js/chatHandler.js +62 -18
static/js/chatHandler.js CHANGED
@@ -27,7 +27,6 @@ class ChatGPT{
27
  presence_penalty: 0.0
28
  };
29
  }
30
- this.retries = 0;
31
  this.execStart = 0;
32
 
33
  this.endpointChat = "/chat_stream";
@@ -43,11 +42,21 @@ class ChatGPT{
43
  });
44
  $(document).on("enviar:reintentar", (event, params) => {
45
  this.reintentos++;
46
- this.enviar(params.mensaje)
 
 
 
 
 
 
 
 
 
 
 
 
47
  });
48
 
49
- $(document).on("enviar:error", (event, params) => this.reenviar(params));
50
-
51
 
52
  }
53
 
@@ -68,18 +77,22 @@ class ChatGPT{
68
  $(document).trigger("enviar:fallido",{jqXHR:params.jqXHR, status:params.status, error:params.error, execTime:params.execTime, mensaje:params.mensaje});
69
  return
70
  }
71
- if(this.retries < 3 ){
72
  $(document).trigger("enviar:reintentar",{jqXHR:params.jqXHR, status:params.status, error:params.error, execTime:params.execTime, mensaje:params.mensaje});
73
  $(document).trigger("enviar:enviar",{jqXHR:params.jqXHR, status:params.status, error:params.error, execTime:params.execTime, mensaje:params.mensaje});
74
 
75
  }else{
76
  $(document).trigger("enviar:fallido",{jqXHR:params.jqXHR, status:params.status, error:params.error, execTime:params.execTime, mensaje:params.mensaje});
 
77
  }
78
  }
79
 
80
  enviar(mensaje){
 
81
  let tempMensajes = [];
82
  let tokens = 0;
 
 
83
  for(let i = 0; i < this.convesacion.length; i++){
84
  let actMsg = this.convesacion[i];
85
  tempMensajes.push({role: actMsg.role, content: actMsg.content})
@@ -87,11 +100,24 @@ class ChatGPT{
87
  }
88
 
89
  console.log("Enviando: ", mensaje);
90
- tempMensajes.push({role: "user", content: mensaje});
91
- this.convesacion.push({role: "user", content: mensaje});
92
- this.convesacion.push({});
93
- $(document).trigger("precarga:inicio", mensaje);
 
 
 
 
 
 
 
 
 
 
 
94
  let self = this;
 
 
95
  fetch(this.endpointChat, {
96
  method: "POST",
97
  body: JSON.stringify({
@@ -103,49 +129,67 @@ class ChatGPT{
103
  rb: response.body,
104
  rstat: response.status
105
  })).then(({rb, rstat}) => {
106
- if(!rb){
107
- return false;
108
- }
109
  const reader = rb.getReader();
110
 
 
111
  return new ReadableStream({
112
  start(controller) {
113
  function push() {
 
114
  reader.read().then(({done, value}) => {
115
 
116
  if(rstat != 200){
 
 
117
  controller.close();
118
- // this.convesacion.pop()
119
- console.log("ERROOOOOOOORRRRROOORRROOOR")
120
- $(document).trigger("precarga:error", {status: rstat, mensaje: data.detail});
121
  }
 
122
 
123
  if(done){
 
124
  controller.close();
125
- console.log("terminado con errores")
 
 
126
  return
127
  }
128
 
 
129
  let elements = new TextDecoder("utf-8").decode(value).split("}{");
130
  let elLen = elements.length;
 
 
131
  for(let i in elements){
132
- let data = elements[i];
 
133
  if(!data){
134
  continue;
135
  }
136
 
 
137
  data =JSON.parse((i>0?"{":"") + data + (i<elLen-1?"}":""));
138
 
139
-
140
  if(data.object == "chat.token"){
 
141
  self.token = data.token;
 
142
  }else if(data.choices[0].hasOwnProperty("delta")){
 
 
 
143
  let temp = data.choices[0].delta;
144
  let key = Object.keys(temp)[0];
145
  let elActual = self.convesacion[self.convesacion.length-1]
 
 
146
  if(!elActual.hasOwnProperty(key)){elActual[key]="";}
147
  elActual[key] += temp[key]
 
148
  if(elActual.hasOwnProperty("content") && temp.content){
 
149
  $(document).trigger("precarga:mensaje", temp.content);
150
  }
151
  }
 
27
  presence_penalty: 0.0
28
  };
29
  }
 
30
  this.execStart = 0;
31
 
32
  this.endpointChat = "/chat_stream";
 
42
  });
43
  $(document).on("enviar:reintentar", (event, params) => {
44
  this.reintentos++;
45
+ this.enviar("")
46
+ });
47
+
48
+ $(document).on("enviar:error", (event, params) => {
49
+ if((params.rstat == 500 || params.rstat == 408) && this.reintentos < 3){
50
+ this.reintentos++;
51
+ this.enviar(params.message)
52
+ }
53
+ else{
54
+ let rstat = params.rstat !=""? params.rstat : 500;
55
+ let mensaje = params.mensaje !=""? params.mensaje : "Desconocido";;
56
+ $(document).trigger("precarga:error", {status: rstat, mensaje: mensaje})
57
+ }
58
  });
59
 
 
 
60
 
61
  }
62
 
 
77
  $(document).trigger("enviar:fallido",{jqXHR:params.jqXHR, status:params.status, error:params.error, execTime:params.execTime, mensaje:params.mensaje});
78
  return
79
  }
80
+ if(this.reintentos < 3 ){
81
  $(document).trigger("enviar:reintentar",{jqXHR:params.jqXHR, status:params.status, error:params.error, execTime:params.execTime, mensaje:params.mensaje});
82
  $(document).trigger("enviar:enviar",{jqXHR:params.jqXHR, status:params.status, error:params.error, execTime:params.execTime, mensaje:params.mensaje});
83
 
84
  }else{
85
  $(document).trigger("enviar:fallido",{jqXHR:params.jqXHR, status:params.status, error:params.error, execTime:params.execTime, mensaje:params.mensaje});
86
+ // $(document).trigger("precarga:reintento"
87
  }
88
  }
89
 
90
  enviar(mensaje){
91
+ // Configuración de variables base
92
  let tempMensajes = [];
93
  let tokens = 0;
94
+
95
+ // Calculo de tokens y reconfiguración de mensajes para este caso
96
  for(let i = 0; i < this.convesacion.length; i++){
97
  let actMsg = this.convesacion[i];
98
  tempMensajes.push({role: actMsg.role, content: actMsg.content})
 
100
  }
101
 
102
  console.log("Enviando: ", mensaje);
103
+
104
+
105
+ if(this.reintentos==0){
106
+ //si es el primer intento
107
+
108
+ // Inclusión del nuevo mensaje
109
+ tempMensajes.push({role: "user", content: mensaje});
110
+ // Si es un reintento no se incluye a la lista
111
+ this.convesacion.push({role: "user", content: mensaje});
112
+ // Evento para anunciar el inicio de un envio
113
+ $(document).trigger("precarga:inicio", mensaje);
114
+
115
+ }
116
+
117
+ // se almacena this para uso futuro
118
  let self = this;
119
+
120
+ //se inicia la llamada async
121
  fetch(this.endpointChat, {
122
  method: "POST",
123
  body: JSON.stringify({
 
129
  rb: response.body,
130
  rstat: response.status
131
  })).then(({rb, rstat}) => {
132
+ // se crea el lector async
 
 
133
  const reader = rb.getReader();
134
 
135
+ // stream
136
  return new ReadableStream({
137
  start(controller) {
138
  function push() {
139
+ // si hay data
140
  reader.read().then(({done, value}) => {
141
 
142
  if(rstat != 200){
143
+ // si se retornó un codigo no 200, se cierra el stream
144
+ // y se destruye el msg de respuesta
145
  controller.close();
146
+ this.convesacion.pop()
147
+ $(document).trigger("enviar:error", {status: rstat, mensaje: mensaje, detail: data.detail});
 
148
  }
149
+
150
 
151
  if(done){
152
+ // si finalizó el stream cierra
153
  controller.close();
154
+ $(document).trigger("precarga:fin");
155
+ localStorage.setItem("convesacion", JSON.stringify(self.convesacion))
156
+ console.log("terminado", self.convesacion[self.convesacion.length-1].content)
157
  return
158
  }
159
 
160
+ // se lee el mensaje y se separa si viene más de 1 json
161
  let elements = new TextDecoder("utf-8").decode(value).split("}{");
162
  let elLen = elements.length;
163
+
164
+ // se procesa cada mensaje
165
  for(let i in elements){
166
+ // se asigna el elemento actual a data
167
+ let data = elements[i];
168
  if(!data){
169
  continue;
170
  }
171
 
172
+ // se parsea el json
173
  data =JSON.parse((i>0?"{":"") + data + (i<elLen-1?"}":""));
174
 
 
175
  if(data.object == "chat.token"){
176
+ // si el elemento es un token seguridad
177
  self.token = data.token;
178
+
179
  }else if(data.choices[0].hasOwnProperty("delta")){
180
+ // si el elemento es parte del mensaje
181
+
182
+ // Se separa los datos base
183
  let temp = data.choices[0].delta;
184
  let key = Object.keys(temp)[0];
185
  let elActual = self.convesacion[self.convesacion.length-1]
186
+
187
+
188
  if(!elActual.hasOwnProperty(key)){elActual[key]="";}
189
  elActual[key] += temp[key]
190
+
191
  if(elActual.hasOwnProperty("content") && temp.content){
192
+ //si tiene contenido se incluye al mesaje y se avisa via evento
193
  $(document).trigger("precarga:mensaje", temp.content);
194
  }
195
  }