diff --git a/langfuse/client.py b/langfuse/client.py index 784be1a66..de495e71e 100644 --- a/langfuse/client.py +++ b/langfuse/client.py @@ -907,6 +907,25 @@ def score( self.client, new_id, StateType.TRACE, new_id, self.task_manager ) + def delete_score(self, *, score_id: str) -> None: + """Delete a score via the Langfuse API by its id. + + Args: + id: The id of the score to delete. + + Returns: + None + + Raises: + Exception: If the score with the given id could not be found within the authenticated project or if an error occurred during the request. + """ + try: + self.log.debug(f"Deleting score {id}") + self.client.score.delete(score_id=score_id) + except Exception as e: + self.log.exception(e) + raise e + def span( self, *, diff --git a/tests/test_core_sdk.py b/tests/test_core_sdk.py index 8c32cee7a..716a0abe0 100644 --- a/tests/test_core_sdk.py +++ b/tests/test_core_sdk.py @@ -105,6 +105,44 @@ def test_create_score(): assert trace["scores"][0]["id"] == score_id +def test_delete_score(): + langfuse = Langfuse(debug=False) + api_wrapper = LangfuseAPI() + + trace = langfuse.trace( + name="this-is-so-great-new", + user_id="test", + metadata="test", + ) + + langfuse.flush() + assert langfuse.task_manager._queue.qsize() == 0 + + score_id = create_uuid() + + langfuse.score( + id=score_id, + trace_id=trace.id, + name="this-is-a-score", + value=1, + ) + + langfuse.flush() + assert langfuse.task_manager._queue.qsize() == 0 + + trace = api_wrapper.get_trace(trace.id) + assert trace["scores"][0]["id"] == score_id + + langfuse.delete_score(score_id) + + langfuse.flush() + assert langfuse.task_manager._queue.qsize() == 0 + + trace = api_wrapper.get_trace(trace.id) + + assert len(trace["scores"]) == 0 + + def test_create_trace(): langfuse = Langfuse( debug=False,