From 416f69976807f6772096d6d11905a3ee7b99d32d Mon Sep 17 00:00:00 2001 From: Rudra Dudhat Date: Sun, 28 Jun 2026 10:25:24 +0530 Subject: [PATCH] fix(score): raise ValueError when create_score receives None name or value --- langfuse/_client/client.py | 3 ++ tests/unit/test_create_score_validation.py | 36 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 tests/unit/test_create_score_validation.py diff --git a/langfuse/_client/client.py b/langfuse/_client/client.py index bfd8267fc..3d158daa7 100644 --- a/langfuse/_client/client.py +++ b/langfuse/_client/client.py @@ -39,6 +39,7 @@ _agnosticcontextmanager, ) from packaging.version import Version +from pydantic import ValidationError from typing_extensions import deprecated from langfuse._client.attributes import ( @@ -1952,6 +1953,8 @@ def create_score( force_sample=force_sample, ) + except ValidationError as e: + raise ValueError(f"Invalid score parameters: {e}") from e except Exception as e: langfuse_logger.exception( f"Error creating score: Failed to process score event for trace_id={trace_id}, name={name}. Error: {e}" diff --git a/tests/unit/test_create_score_validation.py b/tests/unit/test_create_score_validation.py new file mode 100644 index 000000000..f121855fd --- /dev/null +++ b/tests/unit/test_create_score_validation.py @@ -0,0 +1,36 @@ +"""Unit tests for create_score input validation. + +Ensures that programmer errors (None name or value) raise ValueError +at the call site rather than being silently swallowed. +""" + +import pytest + +from langfuse import Langfuse +from langfuse._client.resource_manager import LangfuseResourceManager + + +@pytest.fixture(autouse=True) +def _clear_singleton(): + yield + with LangfuseResourceManager._lock: + LangfuseResourceManager._instances.clear() + + +@pytest.fixture() +def lf(): + return Langfuse( + public_key="pk-lf-test", + secret_key="sk-lf-test", + host="http://localhost:19999", + ) + + +def test_create_score_raises_on_none_value(lf): + with pytest.raises(ValueError, match="Invalid score parameters"): + lf.create_score(name="accuracy", value=None, trace_id="fake-trace-id") + + +def test_create_score_raises_on_none_name(lf): + with pytest.raises(ValueError, match="Invalid score parameters"): + lf.create_score(name=None, value=0.9, trace_id="fake-trace-id")