(
&self,
os: &Os,
result: TelemetryResult,
reason: Option<String>,
reason_desc: Option<String>,
status_code: Option<u16>,
is_end_turn: bool,
| 3698 | /// current user turn. |
| 3699 | #[allow(clippy::too_many_arguments)] |
| 3700 | async fn send_chat_telemetry( |
| 3701 | &self, |
| 3702 | os: &Os, |
| 3703 | result: TelemetryResult, |
| 3704 | reason: Option<String>, |
| 3705 | reason_desc: Option<String>, |
| 3706 | status_code: Option<u16>, |
| 3707 | is_end_turn: bool, |
| 3708 | ) { |
| 3709 | // Get metadata for the most recent request. |
| 3710 | let md = self.user_turn_request_metadata.last(); |
| 3711 | |
| 3712 | let conversation_id = self.conversation.conversation_id().to_owned(); |
| 3713 | let data = ChatAddedMessageParams { |
| 3714 | request_id: md.and_then(|md| md.request_id.clone()), |
| 3715 | message_id: md.map(|md| md.message_id.clone()), |
| 3716 | context_file_length: self.conversation.context_message_length(), |
| 3717 | model: md.and_then(|m| m.model_id.clone()), |
| 3718 | reason: reason.clone(), |
| 3719 | reason_desc: reason_desc.clone(), |
| 3720 | status_code, |
| 3721 | time_to_first_chunk_ms: md.and_then(|md| md.time_to_first_chunk.map(|d| d.as_secs_f64() * 1000.0)), |
| 3722 | time_between_chunks_ms: md.map(|md| { |
| 3723 | md.time_between_chunks |
| 3724 | .iter() |
| 3725 | .map(|d| d.as_secs_f64() * 1000.0) |
| 3726 | .collect::<Vec<_>>() |
| 3727 | }), |
| 3728 | chat_conversation_type: md.and_then(|md| md.chat_conversation_type), |
| 3729 | tool_use_id: self.conversation.latest_tool_use_ids(), |
| 3730 | tool_name: self.conversation.latest_tool_use_names(), |
| 3731 | assistant_response_length: md.map(|md| md.response_size as i32), |
| 3732 | message_meta_tags: { |
| 3733 | let mut tags = md.map(|md| md.message_meta_tags.clone()).unwrap_or_default(); |
| 3734 | if self.conversation.is_in_tangent_mode() { |
| 3735 | tags.push(crate::telemetry::core::MessageMetaTag::TangentMode); |
| 3736 | } |
| 3737 | tags |
| 3738 | }, |
| 3739 | }; |
| 3740 | os.telemetry |
| 3741 | .send_chat_added_message(&os.database, conversation_id.clone(), result, data) |
| 3742 | .await |
| 3743 | .ok(); |
| 3744 | |
| 3745 | if is_end_turn { |
| 3746 | let mds = &self.user_turn_request_metadata; |
| 3747 | |
| 3748 | // Get the user turn duration. |
| 3749 | let start_time = mds.first().map(|md| md.request_start_timestamp_ms); |
| 3750 | let end_time = mds.last().map(|md| md.stream_end_timestamp_ms); |
| 3751 | let user_turn_duration_seconds = match (start_time, end_time) { |
| 3752 | // Convert ms back to seconds |
| 3753 | (Some(start), Some(end)) => end.saturating_sub(start) as i64 / 1000, |
| 3754 | _ => 0, |
| 3755 | }; |
| 3756 | |
| 3757 | os.telemetry |
no test coverage detected