blackmistcode commited on
Commit
5fad289
Β·
verified Β·
1 Parent(s): ff0376a

feat: prioritize HF models first in AI pipeline fallback chain

Browse files
Files changed (1) hide show
  1. backend/src/signals/aiPipeline.js +25 -22
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
- * - Si falla el Space de Qwen β†’ intenta API directa de HuggingFace.
12
- * - Si falla HF directa β†’ intenta OpenRouter (deepseek-chat).
13
- * - Si todo falla β†’ regla basada en precio (rule-based).
 
 
 
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 β†’ DeepSeek β†’ OpenRouter β†’ HF Space β†’ HF directa β†’ Ollama β†’ regla
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. DeepSeek API directa primero
474
- if (!result && config.DEEPSEEK_API_KEY) {
475
  try {
476
- result = await generateWithDeepSeek(market, headlines, cryptoContext);
 
477
  if (!validateSignal(result)) result = null;
478
  } catch (err) {
479
- logger.warn({ err: err.message, status: err.status, marketId: market.id }, 'DeepSeek API failed, trying OpenRouter');
480
  }
481
  }
482
 
483
- // 2. OpenRouter DeepSeek
484
- if (!result && config.OPENROUTER_API_KEY) {
485
  try {
486
- result = await generateWithOpenRouter(market, headlines, cryptoContext);
487
  if (!validateSignal(result)) result = null;
488
  } catch (err) {
489
- logger.warn({ err: err.message, status: err.status, marketId: market.id }, 'OpenRouter DeepSeek failed, trying HF Space');
490
  }
491
  }
492
 
493
- // 3. Respaldo a HF Space
494
- if (!result && config.HF_SPACE_QWEN_URL) {
495
  try {
496
- result = await generateWithQwenSpace(market, headlines, cryptoContext);
497
- result = normalizeSignal(result);
498
  if (!validateSignal(result)) result = null;
499
  } catch (err) {
500
- logger.warn({ err: err.message, marketId: market.id }, 'Qwen Space failed, trying direct API');
501
  }
502
  }
503
 
504
- // 4. Respaldo a API directa de HF
505
- if (!result && config.HF_TOKEN) {
506
  try {
507
- result = await generateWithQwen3Direct(market, headlines, cryptoContext);
508
  if (!validateSignal(result)) result = null;
509
  } catch (err) {
510
- logger.warn({ err: err.message, marketId: market.id }, 'Qwen3 direct API failed, trying Ollama');
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