Spaces:
Sleeping
Sleeping
feat: prioritize HF models first in AI pipeline fallback chain
Browse files
backend/src/signals/aiPipeline.js
CHANGED
|
@@ -7,10 +7,13 @@
|
|
| 7 |
* 2. Generacion de senal (Qwen3-8B Space o API directa HF).
|
| 8 |
* β analiza mercado + noticias filtradas y genera:
|
| 9 |
* { signal: 'bullish'|'bearish'|'neutral', confidence, summary, keyRisk }.
|
| 10 |
-
* 3. Fallbacks:
|
| 11 |
-
* -
|
| 12 |
-
* -
|
| 13 |
-
* -
|
|
|
|
|
|
|
|
|
|
| 14 |
*
|
| 15 |
* Consumido por:
|
| 16 |
* - signals.service.js β generateForMarket(market).
|
|
@@ -454,7 +457,7 @@ export async function run(market) {
|
|
| 454 |
}
|
| 455 |
|
| 456 |
// Paso 2: generacion de senal LLM con cadena de respaldo
|
| 457 |
-
// ORDEN: preferencias usuario β
|
| 458 |
let result = null;
|
| 459 |
|
| 460 |
// 0. Modelo configurado por el usuario (si no es 'auto')
|
|
@@ -470,44 +473,44 @@ export async function run(market) {
|
|
| 470 |
}
|
| 471 |
}
|
| 472 |
|
| 473 |
-
// 1.
|
| 474 |
-
if (!result && config.
|
| 475 |
try {
|
| 476 |
-
result = await
|
|
|
|
| 477 |
if (!validateSignal(result)) result = null;
|
| 478 |
} catch (err) {
|
| 479 |
-
logger.warn({ err: err.message,
|
| 480 |
}
|
| 481 |
}
|
| 482 |
|
| 483 |
-
// 2.
|
| 484 |
-
if (!result && config.
|
| 485 |
try {
|
| 486 |
-
result = await
|
| 487 |
if (!validateSignal(result)) result = null;
|
| 488 |
} catch (err) {
|
| 489 |
-
logger.warn({ err: err.message,
|
| 490 |
}
|
| 491 |
}
|
| 492 |
|
| 493 |
-
// 3.
|
| 494 |
-
if (!result && config.
|
| 495 |
try {
|
| 496 |
-
result = await
|
| 497 |
-
result = normalizeSignal(result);
|
| 498 |
if (!validateSignal(result)) result = null;
|
| 499 |
} catch (err) {
|
| 500 |
-
logger.warn({ err: err.message, marketId: market.id }, '
|
| 501 |
}
|
| 502 |
}
|
| 503 |
|
| 504 |
-
// 4.
|
| 505 |
-
if (!result && config.
|
| 506 |
try {
|
| 507 |
-
result = await
|
| 508 |
if (!validateSignal(result)) result = null;
|
| 509 |
} catch (err) {
|
| 510 |
-
logger.warn({ err: err.message, marketId: market.id }, '
|
| 511 |
}
|
| 512 |
}
|
| 513 |
|
|
|
|
| 7 |
* 2. Generacion de senal (Qwen3-8B Space o API directa HF).
|
| 8 |
* β analiza mercado + noticias filtradas y genera:
|
| 9 |
* { signal: 'bullish'|'bearish'|'neutral', confidence, summary, keyRisk }.
|
| 10 |
+
* 3. Fallbacks (orden de prioridad):
|
| 11 |
+
* - HF Space Qwen3-8B β modelo propio en HF Spaces (gratuito, rapido).
|
| 12 |
+
* - HF API directa Qwen3 β inferencia directa via HF Inference API.
|
| 13 |
+
* - DeepSeek API β API propia de DeepSeek.
|
| 14 |
+
* - OpenRouter β deepseek-chat via OpenRouter.
|
| 15 |
+
* - Ollama local β modelo local qwen3.5:9b.
|
| 16 |
+
* - Rule-based β logica basada en precio del mercado.
|
| 17 |
*
|
| 18 |
* Consumido por:
|
| 19 |
* - signals.service.js β generateForMarket(market).
|
|
|
|
| 457 |
}
|
| 458 |
|
| 459 |
// Paso 2: generacion de senal LLM con cadena de respaldo
|
| 460 |
+
// ORDEN: preferencias usuario β HF Space β HF directa β DeepSeek β OpenRouter β Ollama β regla
|
| 461 |
let result = null;
|
| 462 |
|
| 463 |
// 0. Modelo configurado por el usuario (si no es 'auto')
|
|
|
|
| 473 |
}
|
| 474 |
}
|
| 475 |
|
| 476 |
+
// 1. HF Space Qwen3-8B (prioridad maxima β gratuito y rapido en Spaces)
|
| 477 |
+
if (!result && config.HF_SPACE_QWEN_URL) {
|
| 478 |
try {
|
| 479 |
+
result = await generateWithQwenSpace(market, headlines, cryptoContext);
|
| 480 |
+
result = normalizeSignal(result);
|
| 481 |
if (!validateSignal(result)) result = null;
|
| 482 |
} catch (err) {
|
| 483 |
+
logger.warn({ err: err.message, marketId: market.id }, 'Qwen Space failed, trying HF direct API');
|
| 484 |
}
|
| 485 |
}
|
| 486 |
|
| 487 |
+
// 2. API directa de HuggingFace (respaldos sin Gradio)
|
| 488 |
+
if (!result && config.HF_TOKEN) {
|
| 489 |
try {
|
| 490 |
+
result = await generateWithQwen3Direct(market, headlines, cryptoContext);
|
| 491 |
if (!validateSignal(result)) result = null;
|
| 492 |
} catch (err) {
|
| 493 |
+
logger.warn({ err: err.message, marketId: market.id }, 'HF direct API failed, trying DeepSeek');
|
| 494 |
}
|
| 495 |
}
|
| 496 |
|
| 497 |
+
// 3. DeepSeek API
|
| 498 |
+
if (!result && config.DEEPSEEK_API_KEY) {
|
| 499 |
try {
|
| 500 |
+
result = await generateWithDeepSeek(market, headlines, cryptoContext);
|
|
|
|
| 501 |
if (!validateSignal(result)) result = null;
|
| 502 |
} catch (err) {
|
| 503 |
+
logger.warn({ err: err.message, status: err.status, marketId: market.id }, 'DeepSeek API failed, trying OpenRouter');
|
| 504 |
}
|
| 505 |
}
|
| 506 |
|
| 507 |
+
// 4. OpenRouter DeepSeek
|
| 508 |
+
if (!result && config.OPENROUTER_API_KEY) {
|
| 509 |
try {
|
| 510 |
+
result = await generateWithOpenRouter(market, headlines, cryptoContext);
|
| 511 |
if (!validateSignal(result)) result = null;
|
| 512 |
} catch (err) {
|
| 513 |
+
logger.warn({ err: err.message, status: err.status, marketId: market.id }, 'OpenRouter DeepSeek failed, trying Ollama');
|
| 514 |
}
|
| 515 |
}
|
| 516 |
|