Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

bug(scores): create_score sends numpy.bool_ as JSON `true` and Decimal as "<Decimal>" since v5.0.2

Abierto Apto para principiantes
#2,057 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@lalith0407 ya está trabajando en esto.

Desde el 25/10/2026.

  • #2058 de @lalith0407 — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
74/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
numpy, python
Área
api, backend

Línea de trabajo

Empieza por leer el cambio en #2006 e inspecciona la construcción del payload de create_score y el comportamiento de EventSerializer mencionados en la reproducción. Ejecuta la reproducción offline proporcionada con numpy.bool_ y decimal.Decimal y comprueba después que todos los valores que no sean cadenas y que float() acepte se serialicen como números JSON, mientras que las cadenas sigan siendo cadenas.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug feat-scores sdk-python
Describe the bug

#2006 (perf: build create_score body without Fern's dict(), in v5.0.2) replaced CreateScoreRequest(...) with a hand-built dict and kept only the bool/int → float coercion the model used to do. The model coerced every non-str value to float, so other numeric types now go out differently:

value passed to create_score v5.0.1 (before #2006) main (ab861f1)
True 1.0 1.0
numpy.bool_(True) (e.g. np.mean(hits) > 0.5) 1.0 true
decimal.Decimal("0.75") 0.75 "<Decimal>"
numpy.int64(3) 3.0 3

The server's score body takes z.union([z.string(), z.number()]) for value, so a JSON boolean is rejected. "<Decimal>" is accepted as a string, so the numeric score quietly turns into a categorical value "<Decimal>". This goes through every scoring path: create_score, span.score(), score_current_span/trace, and experiment item and run evaluators (Evaluation(value=...)), where numpy results are common.

To reproduce (no network, the score queue is captured)
import json, decimal, numpy as np
from langfuse import Langfuse
from langfuse._utils.serializer import EventSerializer

lf = Langfuse(public_key="pk-lf-test", secret_key="sk-lf-test", base_url="http://127.0.0.1:9")
sent = []
lf._resources.add_score_task = lambda score, **kw: sent.append(score)
for v in [np.bool_(True), decimal.Decimal("0.75")]:
    lf.create_score(name="accuracy", value=v, trace_id="0" * 31 + "1")
print([json.loads(json.dumps(s, cls=EventSerializer))["value"] for s in sent])
# main: [True, '<Decimal>']   v5.0.1: [1.0, 0.75]
Expected

Same payload as before #2006: any non-str value that float() accepts is sent as a float.

SDK: langfuse-python main ab861f1 (v5.0.4), Python 3.12.

Lenguaje dominante
Python
Estrellas
504
Forks
391
Merge medio
1 d 1 h
PR fusionados (30 d)
64

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de langfuse/langfuse-python

Todos los issues de langfuse/langfuse-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.