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

Đang mở Phù hợp với người mới
#2,057 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@lalith0407 đang làm issue này rồi.

Từ ngày 25/10/2026.

  • #2058 của @lalith0407 — đang mở

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
74/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
numpy, python
Lĩnh vực
api, backend

Hướng nghiên cứu

Bắt đầu bằng cách đọc thay đổi trong #2006 và kiểm tra cách tạo payload của create_score cùng hành vi của EventSerializer được nêu trong phần tái hiện. Chạy phần tái hiện ngoại tuyến được cung cấp với numpy.bool_ và decimal.Decimal, sau đó kiểm tra rằng mọi giá trị không phải chuỗi được float() chấp nhận đều được tuần tự hóa thành số JSON, còn chuỗi vẫn là chuỗi.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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.

Ngôn ngữ chính
Python
Star
504
Fork
391
Merge trung bình
1 ngày 3 giờ
Pull request đã merge (30 ngày)
74

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của langfuse/langfuse-python

Tất cả issue của langfuse/langfuse-python

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.