Spaces:
Running
Running
Miguel Diaz
commited on
Commit
•
42d365f
1
Parent(s):
f279b13
dev: corrección reenviar en error
Browse files- 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(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
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 |
-
|
91 |
-
|
92 |
-
this.
|
93 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
119 |
-
|
120 |
-
$(document).trigger("precarga:error", {status: rstat, mensaje: data.detail});
|
121 |
}
|
|
|
122 |
|
123 |
if(done){
|
|
|
124 |
controller.close();
|
125 |
-
|
|
|
|
|
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 |
-
|
|
|
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 |
}
|