Skip to content

Commit c235775

Browse files
committed
Make refs optional
1 parent ae4972c commit c235775

File tree

2 files changed

+51
-21
lines changed

2 files changed

+51
-21
lines changed

util/opentelemetry-util-genai/src/opentelemetry/util/genai/_upload/completion_hook.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@
6060

6161
@dataclass
6262
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
6666

6767

6868
@dataclass
@@ -203,17 +203,19 @@ def _do_upload(
203203
def on_completion(
204204
self,
205205
*,
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,
209209
span: Span | None = None,
210210
log_record: LogRecord | None = None,
211211
**kwargs: Any,
212212
) -> None:
213+
if not any([inputs, outputs, system_instruction]):
214+
return
213215
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,
217219
)
218220
# generate the paths to upload to
219221
ref_names = self._calculate_ref_path()
@@ -225,23 +227,36 @@ def to_dict(
225227
) -> JsonEncodeable:
226228
return [asdict(dc) for dc in dataclass_list]
227229

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+
]
228251
self._submit_all(
229252
{
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+
}
237256
)
238257

239258
# 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}
245260
if span:
246261
span.set_attributes(references)
247262
if log_record:

util/opentelemetry-util-genai/tests/test_upload.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,21 @@ def test_upload_then_shutdown(self):
162162
"should have uploaded 3 files",
163163
)
164164

165+
def test_upload_when_inputs_outputs_empty(self):
166+
self.hook.on_completion(
167+
inputs=[],
168+
outputs=[],
169+
system_instruction=FAKE_SYSTEM_INSTRUCTION,
170+
)
171+
# all items should be consumed
172+
self.hook.shutdown()
173+
174+
self.assertEqual(
175+
self.mock_fs.open.call_count,
176+
1,
177+
"should have uploaded 1 file",
178+
)
179+
165180
def test_upload_blocked(self):
166181
with self.block_upload():
167182
# fill the queue

0 commit comments

Comments
 (0)