60
60
61
61
@dataclass
62
62
class Completion :
63
- inputs : list [types .InputMessage ]
64
- outputs : list [types .OutputMessage ]
65
- system_instruction : list [types .MessagePart ]
63
+ inputs : list [types .InputMessage ] | None
64
+ outputs : list [types .OutputMessage ] | None
65
+ system_instruction : list [types .MessagePart ] | None
66
66
67
67
68
68
@dataclass
@@ -203,17 +203,19 @@ def _do_upload(
203
203
def on_completion (
204
204
self ,
205
205
* ,
206
- inputs : list [types .InputMessage ],
207
- outputs : list [types .OutputMessage ],
208
- system_instruction : list [types .MessagePart ],
206
+ inputs : list [types .InputMessage ] | None = None ,
207
+ outputs : list [types .OutputMessage ] | None = None ,
208
+ system_instruction : list [types .MessagePart ] | None = None ,
209
209
span : Span | None = None ,
210
210
log_record : LogRecord | None = None ,
211
211
** kwargs : Any ,
212
212
) -> None :
213
+ if not any ([inputs , outputs , system_instruction ]):
214
+ return
213
215
completion = Completion (
214
- inputs = inputs ,
215
- outputs = outputs ,
216
- system_instruction = system_instruction ,
216
+ inputs = inputs or None ,
217
+ outputs = outputs or None ,
218
+ system_instruction = system_instruction or None ,
217
219
)
218
220
# generate the paths to upload to
219
221
ref_names = self ._calculate_ref_path ()
@@ -225,23 +227,36 @@ def to_dict(
225
227
) -> JsonEncodeable :
226
228
return [asdict (dc ) for dc in dataclass_list ]
227
229
230
+ references = [
231
+ (ref_name , ref , ref_attr )
232
+ for ref_name , ref , ref_attr in [
233
+ (
234
+ ref_names .inputs_ref ,
235
+ completion .inputs ,
236
+ GEN_AI_INPUT_MESSAGES_REF ,
237
+ ),
238
+ (
239
+ ref_names .outputs_ref ,
240
+ completion .outputs ,
241
+ GEN_AI_OUTPUT_MESSAGES_REF ,
242
+ ),
243
+ (
244
+ ref_names .system_instruction_ref ,
245
+ completion .system_instruction ,
246
+ GEN_AI_SYSTEM_INSTRUCTIONS_REF ,
247
+ ),
248
+ ]
249
+ if ref
250
+ ]
228
251
self ._submit_all (
229
252
{
230
- # Use partial to defer as much as possible to the background threads
231
- ref_names .inputs_ref : partial (to_dict , completion .inputs ),
232
- ref_names .outputs_ref : partial (to_dict , completion .outputs ),
233
- ref_names .system_instruction_ref : partial (
234
- to_dict , completion .system_instruction
235
- ),
236
- },
253
+ ref_name : partial (to_dict , ref )
254
+ for ref_name , ref , _ in references
255
+ }
237
256
)
238
257
239
258
# stamp the refs on telemetry
240
- references = {
241
- GEN_AI_INPUT_MESSAGES_REF : ref_names .inputs_ref ,
242
- GEN_AI_OUTPUT_MESSAGES_REF : ref_names .outputs_ref ,
243
- GEN_AI_SYSTEM_INSTRUCTIONS_REF : ref_names .system_instruction_ref ,
244
- }
259
+ references = {ref_attr : name for name , _ , ref_attr in references }
245
260
if span :
246
261
span .set_attributes (references )
247
262
if log_record :
0 commit comments