|
130 | 130 | from langfuse.types import MaskFunction, ScoreDataType, SpanLevel, TraceContext |
131 | 131 |
|
132 | 132 |
|
| 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 | + |
133 | 154 | class Langfuse: |
134 | 155 | """Main client for Langfuse tracing and platform features. |
135 | 156 |
|
@@ -2937,7 +2958,35 @@ async def _process_experiment_item( |
2937 | 2958 | dataset_run_id = dataset_run_item.dataset_run_id |
2938 | 2959 |
|
2939 | 2960 | 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) |
2941 | 2990 |
|
2942 | 2991 | if ( |
2943 | 2992 | not isinstance(item, dict) |
|
0 commit comments