Spaces:
Sleeping
Sleeping
Update main.py
Browse files
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(
|
|
|
|
|
|
|
| 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):
|