Spaces:
Running
Running
Updated to most recent models and add ts in logging
Browse files- docker-compose.yml +1 -1
- server.js +38 -25
docker-compose.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
services:
|
2 |
jaycoach:
|
3 |
-
|
4 |
environment:
|
5 |
- HF_TOKEN=$HF_TOKEN
|
6 |
ports:
|
|
|
1 |
services:
|
2 |
jaycoach:
|
3 |
+
build: .
|
4 |
environment:
|
5 |
- HF_TOKEN=$HF_TOKEN
|
6 |
ports:
|
server.js
CHANGED
@@ -2,15 +2,16 @@ const express = require('express')
|
|
2 |
const app = express()
|
3 |
const port = 8080
|
4 |
|
5 |
-
process.on('uncaughtException', err =>
|
6 |
|
7 |
const hfToken = process.env.HF_TOKEN
|
8 |
|
9 |
|
10 |
const MODELS = {
|
11 |
|
12 |
-
|
13 |
-
|
|
|
14 |
,prompt: function(prompt){
|
15 |
return [
|
16 |
"<|user|>"
|
@@ -21,22 +22,21 @@ const MODELS = {
|
|
21 |
}
|
22 |
}
|
23 |
|
24 |
-
|
25 |
-
|
|
|
26 |
,prompt: function(prompt){
|
27 |
return [
|
28 |
-
"<|user|>"
|
29 |
-
,prompt
|
30 |
-
+"
|
31 |
-
,"<|assistant|>"
|
32 |
].join("\n")
|
33 |
}
|
34 |
}
|
35 |
|
36 |
|
37 |
-
|
38 |
-
|
39 |
-
name: 'meta-llama/Meta-Llama-3-8B-Instruct'
|
40 |
,prompt: function(prompt){
|
41 |
return [
|
42 |
"<|start_header_id|>user<|end_header_id|>"
|
@@ -46,8 +46,11 @@ const MODELS = {
|
|
46 |
}
|
47 |
}
|
48 |
|
49 |
-
|
50 |
-
|
|
|
|
|
|
|
51 |
,prompt: function(prompt){
|
52 |
return [
|
53 |
"[INST]"+prompt+"[/INST]"
|
@@ -56,6 +59,7 @@ const MODELS = {
|
|
56 |
|
57 |
}
|
58 |
|
|
|
59 |
,'gemma':{
|
60 |
name: 'google/gemma-1.1-7b-it'
|
61 |
,prompt: function(prompt){
|
@@ -71,6 +75,13 @@ const MODELS = {
|
|
71 |
|
72 |
}
|
73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
|
75 |
if(!hfToken){
|
76 |
throw new Error('NO TOKEN!');
|
@@ -177,6 +188,7 @@ async function GetModelAnswer(model, prompt){
|
|
177 |
while(i--){ // pra evitar um loop infinito, vai girar no maximo o numero de models...
|
178 |
let ModelConfig = MODELS[model];
|
179 |
let MyStats = ModelConfig.stats;
|
|
|
180 |
console.log(MyStats);
|
181 |
let InferenceApi = 'https://api-inference.huggingface.co/models/' + ModelConfig.name;
|
182 |
|
@@ -193,7 +205,7 @@ async function GetModelAnswer(model, prompt){
|
|
193 |
}
|
194 |
}
|
195 |
|
196 |
-
|
197 |
MyStats.total++;
|
198 |
let StartTime = new Date();
|
199 |
const response = await fetch(
|
@@ -206,11 +218,11 @@ async function GetModelAnswer(model, prompt){
|
|
206 |
);
|
207 |
let EndTime = new Date();
|
208 |
let ElapsedTime = EndTime.getTime() - StartTime.getTime();
|
209 |
-
|
210 |
|
211 |
if(response.status != 200){
|
212 |
MyStats.erros++;
|
213 |
-
|
214 |
if(StartIndex == null)
|
215 |
StartIndex = ModelList.map(m => m.id).indexOf(model);
|
216 |
|
@@ -220,12 +232,12 @@ async function GetModelAnswer(model, prompt){
|
|
220 |
NextIndex = 0;
|
221 |
|
222 |
if(NextIndex == StartIndex){
|
223 |
-
|
224 |
throw new Error('SOME_SHIT_HAPPENS');
|
225 |
}
|
226 |
|
227 |
model = ModelList[NextIndex].id;
|
228 |
-
|
229 |
continue;
|
230 |
}
|
231 |
|
@@ -240,7 +252,7 @@ async function GetModelAnswer(model, prompt){
|
|
240 |
if(MyStats.erros < 0) MyStats.erros = 0;
|
241 |
}
|
242 |
|
243 |
-
|
244 |
const result = await response.json();
|
245 |
LastWorkedModel = model;
|
246 |
return {
|
@@ -331,7 +343,7 @@ async function Prompt(opts){
|
|
331 |
---
|
332 |
`
|
333 |
|
334 |
-
|
335 |
let answer = await GetModelAnswer(model, prompt);
|
336 |
return answer;
|
337 |
}
|
@@ -368,7 +380,7 @@ app.get('/error', async (req, res) => {
|
|
368 |
|
369 |
let ModelInfo = MODELS[result.model]
|
370 |
|
371 |
-
|
372 |
|
373 |
let resp = result.result;
|
374 |
if(!resp || !Array.isArray(resp)){
|
@@ -393,8 +405,9 @@ app.get('/error', async (req, res) => {
|
|
393 |
ModelInfo.stats.erros += 0.05;
|
394 |
}
|
395 |
|
396 |
-
|
397 |
-
|
|
|
398 |
res.json({text:txtFinal, model:result.model, TotalMs})
|
399 |
})
|
400 |
|
@@ -421,5 +434,5 @@ app.use(function(err, req, res, next) {
|
|
421 |
|
422 |
|
423 |
app.listen(port, () => {
|
424 |
-
|
425 |
})
|
|
|
2 |
const app = express()
|
3 |
const port = 8080
|
4 |
|
5 |
+
process.on('uncaughtException', err => log('JayCoach:Exception:', err))
|
6 |
|
7 |
const hfToken = process.env.HF_TOKEN
|
8 |
|
9 |
|
10 |
const MODELS = {
|
11 |
|
12 |
+
|
13 |
+
'phi3.5': {
|
14 |
+
name: 'microsoft/Phi-3.5-mini-instruct'
|
15 |
,prompt: function(prompt){
|
16 |
return [
|
17 |
"<|user|>"
|
|
|
22 |
}
|
23 |
}
|
24 |
|
25 |
+
|
26 |
+
,'lama3.1': {
|
27 |
+
name: 'meta-llama/Meta-Llama-3.1-8B-Instruct'
|
28 |
,prompt: function(prompt){
|
29 |
return [
|
30 |
+
"<|start_header_id|>user<|end_header_id|>"
|
31 |
+
,prompt+"<|eot_id|><|start_header_id|>assistant<|end_header_id|>"
|
32 |
+
+""
|
|
|
33 |
].join("\n")
|
34 |
}
|
35 |
}
|
36 |
|
37 |
|
38 |
+
,'lama3.2v': {
|
39 |
+
name: 'meta-llama/Llama-3.2-11B-Vision-Instruct'
|
|
|
40 |
,prompt: function(prompt){
|
41 |
return [
|
42 |
"<|start_header_id|>user<|end_header_id|>"
|
|
|
46 |
}
|
47 |
}
|
48 |
|
49 |
+
|
50 |
+
|
51 |
+
|
52 |
+
,'mistral-small':{
|
53 |
+
name: 'mistralai/Mistral-Small-Instruct-2409'
|
54 |
,prompt: function(prompt){
|
55 |
return [
|
56 |
"[INST]"+prompt+"[/INST]"
|
|
|
59 |
|
60 |
}
|
61 |
|
62 |
+
|
63 |
,'gemma':{
|
64 |
name: 'google/gemma-1.1-7b-it'
|
65 |
,prompt: function(prompt){
|
|
|
75 |
|
76 |
}
|
77 |
|
78 |
+
function log(m){
|
79 |
+
let d = new Date();
|
80 |
+
let diso = d.toISOString();
|
81 |
+
|
82 |
+
console.log(`${diso} ${m}`)
|
83 |
+
}
|
84 |
+
|
85 |
|
86 |
if(!hfToken){
|
87 |
throw new Error('NO TOKEN!');
|
|
|
188 |
while(i--){ // pra evitar um loop infinito, vai girar no maximo o numero de models...
|
189 |
let ModelConfig = MODELS[model];
|
190 |
let MyStats = ModelConfig.stats;
|
191 |
+
log("Stats:");
|
192 |
console.log(MyStats);
|
193 |
let InferenceApi = 'https://api-inference.huggingface.co/models/' + ModelConfig.name;
|
194 |
|
|
|
205 |
}
|
206 |
}
|
207 |
|
208 |
+
log("Falando com a IA 🤖", model, ModelConfig.name)
|
209 |
MyStats.total++;
|
210 |
let StartTime = new Date();
|
211 |
const response = await fetch(
|
|
|
218 |
);
|
219 |
let EndTime = new Date();
|
220 |
let ElapsedTime = EndTime.getTime() - StartTime.getTime();
|
221 |
+
log("Total", ElapsedTime);
|
222 |
|
223 |
if(response.status != 200){
|
224 |
MyStats.erros++;
|
225 |
+
log('FAILED: Escolhendo outro...', response.status)
|
226 |
if(StartIndex == null)
|
227 |
StartIndex = ModelList.map(m => m.id).indexOf(model);
|
228 |
|
|
|
232 |
NextIndex = 0;
|
233 |
|
234 |
if(NextIndex == StartIndex){
|
235 |
+
log("Fiz de tudo, mas não deu bom :(");
|
236 |
throw new Error('SOME_SHIT_HAPPENS');
|
237 |
}
|
238 |
|
239 |
model = ModelList[NextIndex].id;
|
240 |
+
log("Tentando com o ",model);
|
241 |
continue;
|
242 |
}
|
243 |
|
|
|
252 |
if(MyStats.erros < 0) MyStats.erros = 0;
|
253 |
}
|
254 |
|
255 |
+
log("Ok, lendo o json...", response.status);
|
256 |
const result = await response.json();
|
257 |
LastWorkedModel = model;
|
258 |
return {
|
|
|
343 |
---
|
344 |
`
|
345 |
|
346 |
+
log("PromptLength: ", prompt.length, prompt);
|
347 |
let answer = await GetModelAnswer(model, prompt);
|
348 |
return answer;
|
349 |
}
|
|
|
380 |
|
381 |
let ModelInfo = MODELS[result.model]
|
382 |
|
383 |
+
log("Respondido", TotalMs, result);
|
384 |
|
385 |
let resp = result.result;
|
386 |
if(!resp || !Array.isArray(resp)){
|
|
|
405 |
ModelInfo.stats.erros += 0.05;
|
406 |
}
|
407 |
|
408 |
+
|
409 |
+
log("FullResp:"+gentext);
|
410 |
+
log(`Final:${txtFinal}`);
|
411 |
res.json({text:txtFinal, model:result.model, TotalMs})
|
412 |
})
|
413 |
|
|
|
434 |
|
435 |
|
436 |
app.listen(port, () => {
|
437 |
+
log(`JayCoach running`)
|
438 |
})
|