antonypamo commited on
Commit
efac162
·
verified ·
1 Parent(s): bb31657

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +91 -3
main.py CHANGED
@@ -301,6 +301,67 @@ def compute_scores_srff_crff_ephi(prompt: str, answer: str):
301
  }
302
  return scores, feats
303
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
  # ============================
305
  # FastAPI app
306
  # ============================
@@ -315,6 +376,8 @@ class EvaluateResponse(BaseModel):
315
  scores: Dict[str, float]
316
  features: Dict[str, float]
317
  sim_summary: Dict[str, Any]
 
 
318
 
319
 
320
  # Para poder reutilizar EvaluateRequest en /quality_remote
@@ -329,6 +392,27 @@ app = FastAPI(
329
  version="1.0.0",
330
  )
331
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
 
333
  class RerankRequest(BaseModel):
334
  """
@@ -440,12 +524,14 @@ def root():
440
  def health():
441
  return {"status": "ok"}
442
 
443
-
444
  @app.post("/evaluate", response_model=EvaluateResponse)
445
  def evaluate(req: EvaluateRequest):
446
  try:
447
  scores, feats = compute_scores_srff_crff_ephi(req.prompt, req.answer)
448
 
 
 
 
449
  # resumen de una simulación adicional (fresca) solo para info
450
  H = build_dirac_hamiltonian(
451
  m=0.25, v=1.0, sigma=0.618,
@@ -453,7 +539,9 @@ def evaluate(req: EvaluateRequest):
453
  flux_vector=(0.0, 0.0, 0.0),
454
  gauge_scale=0.0,
455
  )
456
- rng = np.random.default_rng(abs(hash(req.prompt + req.answer + "sim")) % (2 ** 32))
 
 
457
  vec = rng.normal(0, 1, (2 * N,)) + 1j * rng.normal(0, 1, (2 * N,))
458
  vec /= np.sqrt(np.vdot(vec, vec))
459
  psi0 = vec
@@ -473,12 +561,12 @@ def evaluate(req: EvaluateRequest):
473
  scores=scores,
474
  features=feats,
475
  sim_summary=sim_summary,
 
476
  )
477
  except Exception as e:
478
  print(f"❌ [Runtime] Error en /evaluate: {e}", file=sys.stderr, flush=True)
479
  raise HTTPException(status_code=500, detail="Internal server error")
480
 
481
-
482
  # === SAVANT QUALITY_REMOTE PATCH (alias local de /evaluate) ===
483
  @app.post("/quality_remote", response_model=EvaluateResponse)
484
  def quality_remote(req: QualityRemoteRequest):
 
301
  }
302
  return scores, feats
303
 
304
+ # ============================
305
+ # Role profiles: perfiles de evaluación por rol
306
+ # ============================
307
+
308
+ # Cada perfil define pesos sobre los scores centrales (SRRF, CRRF, E_phi).
309
+ # Puedes ajustar o añadir perfiles según tus necesidades.
310
+ ROLE_PROFILES: Dict[str, Dict[str, float]] = {
311
+ # Perfil neutro: todos los scores cuentan igual.
312
+ "default": {
313
+ "SRRF": 1.0,
314
+ "CRRF": 1.0,
315
+ "E_phi": 1.0,
316
+ },
317
+ # Ejemplo: rol "creative" prioriza E_phi (entropía/creatividad resonante).
318
+ "creative": {
319
+ "SRRF": 0.5,
320
+ "CRRF": 0.5,
321
+ "E_phi": 1.5,
322
+ },
323
+ # Ejemplo: rol "precise" enfatiza CRRF (alineación conceptual fuerte).
324
+ "precise": {
325
+ "SRRF": 1.0,
326
+ "CRRF": 1.8,
327
+ "E_phi": 0.4,
328
+ },
329
+ }
330
+
331
+
332
+ def apply_role_profile(
333
+ scores: Dict[str, float],
334
+ role_name: Optional[str],
335
+ ) -> Dict[str, Any]:
336
+ """
337
+ Aplica un perfil de rol sobre los scores base y devuelve:
338
+ - nombre del rol efectivo
339
+ - pesos usados
340
+ - composite_score (score escalar para ese rol)
341
+ Si role_name es None o desconocido -> usa 'default'.
342
+ """
343
+ if not role_name:
344
+ role_name = "default"
345
+
346
+ profile = ROLE_PROFILES.get(role_name, ROLE_PROFILES["default"])
347
+
348
+ composite = 0.0
349
+ weight_sum = 0.0
350
+ for key, w in profile.items():
351
+ if key in scores:
352
+ composite += w * scores[key]
353
+ weight_sum += abs(w)
354
+
355
+ if weight_sum > 0.0:
356
+ composite /= weight_sum
357
+
358
+ return {
359
+ "role": role_name,
360
+ "weights": profile,
361
+ "composite_score": composite,
362
+ }
363
+
364
+
365
  # ============================
366
  # FastAPI app
367
  # ============================
 
376
  scores: Dict[str, float]
377
  features: Dict[str, float]
378
  sim_summary: Dict[str, Any]
379
+ # NUEVO: resumen del perfil de rol aplicado (si hay model_label)
380
+ role_profile: Optional[Dict[str, Any]] = None
381
 
382
 
383
  # Para poder reutilizar EvaluateRequest en /quality_remote
 
392
  version="1.0.0",
393
  )
394
 
395
+ class RoleProfileInfo(BaseModel):
396
+ name: str
397
+ weights: Dict[str, float]
398
+
399
+
400
+ class RoleProfilesResponse(BaseModel):
401
+ roles: List[RoleProfileInfo]
402
+
403
+
404
+ @app.get("/roles", response_model=RoleProfilesResponse)
405
+ def list_roles():
406
+ """
407
+ Devuelve todos los perfiles de rol configurados en ROLE_PROFILES.
408
+ Útil para que el cliente sepa qué valores puede pasar en model_label.
409
+ """
410
+ roles = [
411
+ RoleProfileInfo(name=name, weights=weights)
412
+ for name, weights in ROLE_PROFILES.items()
413
+ ]
414
+ return RoleProfilesResponse(roles=roles)
415
+
416
 
417
  class RerankRequest(BaseModel):
418
  """
 
524
  def health():
525
  return {"status": "ok"}
526
 
 
527
  @app.post("/evaluate", response_model=EvaluateResponse)
528
  def evaluate(req: EvaluateRequest):
529
  try:
530
  scores, feats = compute_scores_srff_crff_ephi(req.prompt, req.answer)
531
 
532
+ # NUEVO: aplicar perfil de rol usando model_label como selector
533
+ role_profile = apply_role_profile(scores, req.model_label)
534
+
535
  # resumen de una simulación adicional (fresca) solo para info
536
  H = build_dirac_hamiltonian(
537
  m=0.25, v=1.0, sigma=0.618,
 
539
  flux_vector=(0.0, 0.0, 0.0),
540
  gauge_scale=0.0,
541
  )
542
+ rng = np.random.default_rng(
543
+ abs(hash(req.prompt + req.answer + "sim")) % (2 ** 32)
544
+ )
545
  vec = rng.normal(0, 1, (2 * N,)) + 1j * rng.normal(0, 1, (2 * N,))
546
  vec /= np.sqrt(np.vdot(vec, vec))
547
  psi0 = vec
 
561
  scores=scores,
562
  features=feats,
563
  sim_summary=sim_summary,
564
+ role_profile=role_profile, # NUEVO
565
  )
566
  except Exception as e:
567
  print(f"❌ [Runtime] Error en /evaluate: {e}", file=sys.stderr, flush=True)
568
  raise HTTPException(status_code=500, detail="Internal server error")
569
 
 
570
  # === SAVANT QUALITY_REMOTE PATCH (alias local de /evaluate) ===
571
  @app.post("/quality_remote", response_model=EvaluateResponse)
572
  def quality_remote(req: QualityRemoteRequest):