Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions langfuse/logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@
httpx_logger.setLevel(logging.WARNING)

# Add console handler if no handlers exist
console_handler = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
console_handler.setFormatter(formatter)
httpx_logger.addHandler(console_handler)
if not httpx_logger.handlers:
console_handler = logging.StreamHandler()
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
console_handler.setFormatter(formatter)
httpx_logger.addHandler(console_handler)
4 changes: 2 additions & 2 deletions langfuse/openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -898,7 +898,7 @@ def _get_langfuse_data_from_default_response(
completion = None

if resource.type == "completion":
choices = response.get("choices", [])
choices = response.get("choices") or []
if len(choices) > 0:
choice = choices[-1]

Expand All @@ -908,7 +908,7 @@ def _get_langfuse_data_from_default_response(
completion = _extract_response_api_completion(response.get("output", {}))

elif resource.type == "chat":
choices = response.get("choices", [])
choices = response.get("choices") or []
if len(choices) > 0:
# If multiple choices were generated, we'll show all of them in the UI as a list.
if len(choices) > 1:
Expand Down
17 changes: 17 additions & 0 deletions tests/unit/test_logger.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import importlib
import logging
import os

from langfuse import Langfuse
Expand Down Expand Up @@ -34,3 +36,18 @@ def test_debug_langfuse():

# Reset
langfuse_logger.setLevel("WARNING")


def test_httpx_handler_not_duplicated_when_handler_exists():
import langfuse.logger as lf_logger

httpx_logger = logging.getLogger("httpx")
saved = httpx_logger.handlers[:]
httpx_logger.handlers = []
pre_existing = logging.NullHandler()
httpx_logger.addHandler(pre_existing)
try:
importlib.reload(lf_logger)
assert httpx_logger.handlers == [pre_existing]
finally:
httpx_logger.handlers = saved
12 changes: 12 additions & 0 deletions tests/unit/test_openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -1051,3 +1051,15 @@ def test_with_raw_response_streaming_passes_through_untraced(
span.name != "OpenAI-generation"
for span in memory_exporter.get_finished_spans()
)


def test_default_response_handles_null_choices():
for resource_type in ("chat", "completion"):
model, completion, usage = (
lf_openai_module._get_langfuse_data_from_default_response(
SimpleNamespace(type=resource_type, object="ChatCompletion"),
{"model": "gpt-4", "choices": None, "usage": None},
)
)
assert completion is None
assert model == "gpt-4"