Skip to content

Commit f7eb55c

Browse files
committed
chore(experiment-runner): ensure backwards compatibility for old server versions
1 parent 5974a46 commit f7eb55c

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

langfuse/_client/client.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,27 @@
130130
from langfuse.types import MaskFunction, ScoreDataType, SpanLevel, TraceContext
131131

132132

133+
def _is_unrecognized_field_error(e: Exception, field_name: str) -> bool:
134+
"""Check if error contains an unrecognized field.
135+
136+
Used for backward compatibility when newer SDK sends fields not supported by older servers.
137+
138+
Args:
139+
e: Exception from API call
140+
field_name: Name of field to check for in error
141+
142+
Returns:
143+
True if error indicates field_name is unrecognized by the server
144+
"""
145+
try:
146+
return any(
147+
field_name in error.get("keys", [])
148+
for error in getattr(e, "body", {}).get("error", [])
149+
)
150+
except (AttributeError, TypeError):
151+
return False
152+
153+
133154
class Langfuse:
134155
"""Main client for Langfuse tracing and platform features.
135156
@@ -2937,7 +2958,35 @@ async def _process_experiment_item(
29372958
dataset_run_id = dataset_run_item.dataset_run_id
29382959

29392960
except Exception as e:
2940-
langfuse_logger.error(f"Failed to create dataset run item: {e}")
2961+
# Only retry if the error is specifically about datasetVersion being unrecognized
2962+
# This handles backward compatibility with older server versions
2963+
if _is_unrecognized_field_error(e, "datasetVersion"):
2964+
langfuse_logger.warning(
2965+
"Server doesn't support datasetVersion field, retrying without it"
2966+
)
2967+
try:
2968+
dataset_run_item = await asyncio.to_thread(
2969+
self.api.dataset_run_items.create,
2970+
request=CreateDatasetRunItemRequest(
2971+
runName=experiment_run_name,
2972+
runDescription=experiment_description,
2973+
metadata=experiment_metadata,
2974+
datasetItemId=item.id, # type: ignore
2975+
traceId=trace_id,
2976+
observationId=span.id,
2977+
# Note: datasetVersion omitted for backward compatibility
2978+
),
2979+
)
2980+
dataset_run_id = dataset_run_item.dataset_run_id
2981+
except Exception as retry_error:
2982+
error_msg = (
2983+
f"Failed to create dataset run item: {retry_error}"
2984+
)
2985+
langfuse_logger.error(error_msg)
2986+
else:
2987+
# Different error, just log it
2988+
error_msg = f"Failed to create dataset run item: {e}"
2989+
langfuse_logger.error(error_msg)
29412990

29422991
if (
29432992
not isinstance(item, dict)

0 commit comments

Comments
 (0)