Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

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

Aberta Para iniciantes
#2,057 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@lalith0407 já está trabalhando nisso.

Desde 25/10/2026.

  • #2058 de @lalith0407 — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
74/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
numpy, python
Domínio
api, backend

Direção de pesquisa

Comece lendo a alteração em #2006 e inspecione a construção do payload de create_score e o comportamento de EventSerializer mencionados na reprodução. Execute a reprodução offline fornecida com numpy.bool_ e decimal.Decimal e, em seguida, verifique se todo valor que não seja string e que float() aceite é serializado como um número JSON, enquanto strings continuam sendo strings.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.

Linguagem predominante
Python
Estrelas
504
Forks
391
Merge médio
1d 1h
PRs com merge (30d)
64

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de langfuse/langfuse-python

Todas as issues de langfuse/langfuse-python

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.