diff --git a/crates/assistant/src/context.rs b/crates/assistant/src/context.rs index d55b1aee08864202208ff86096494e8c8a9fffce..d72b04e3cddb175ebba5ef431c3dd7959aba3a9f 100644 --- a/crates/assistant/src/context.rs +++ b/crates/assistant/src/context.rs @@ -46,7 +46,7 @@ use std::{ sync::Arc, time::{Duration, Instant}, }; -use telemetry_events::AssistantKind; +use telemetry_events::{AssistantKind, AssistantPhase}; use text::BufferSnapshot; use util::{post_inc, ResultExt, TryFutureExt}; use uuid::Uuid; @@ -2134,6 +2134,7 @@ impl Context { telemetry.report_assistant_event( Some(this.id.0.clone()), AssistantKind::Panel, + AssistantPhase::Response, model.telemetry_id(), response_latency, error_message, diff --git a/crates/assistant/src/inline_assistant.rs b/crates/assistant/src/inline_assistant.rs index eb1bc1eee8b0dade187de654f8277e88ea1948cd..c9360213ae513894e95a6543e6638e2f8b390212 100644 --- a/crates/assistant/src/inline_assistant.rs +++ b/crates/assistant/src/inline_assistant.rs @@ -174,6 +174,18 @@ impl InlineAssistant { initial_prompt: Option, cx: &mut WindowContext, ) { + if let Some(telemetry) = self.telemetry.as_ref() { + if let Some(model) = LanguageModelRegistry::read_global(cx).active_model() { + telemetry.report_assistant_event( + None, + telemetry_events::AssistantKind::Inline, + telemetry_events::AssistantPhase::Invoked, + model.telemetry_id(), + None, + None, + ); + } + } let snapshot = editor.read(cx).buffer().read(cx).snapshot(cx); let mut selections = Vec::>::new(); @@ -708,6 +720,22 @@ impl InlineAssistant { } pub fn finish_assist(&mut self, assist_id: InlineAssistId, undo: bool, cx: &mut WindowContext) { + if let Some(telemetry) = self.telemetry.as_ref() { + if let Some(model) = LanguageModelRegistry::read_global(cx).active_model() { + telemetry.report_assistant_event( + None, + telemetry_events::AssistantKind::Inline, + if undo { + telemetry_events::AssistantPhase::Rejected + } else { + telemetry_events::AssistantPhase::Accepted + }, + model.telemetry_id(), + None, + None, + ); + } + } if let Some(assist) = self.assists.get(&assist_id) { let assist_group_id = assist.group_id; if self.assist_groups[&assist_group_id].linked { @@ -2558,6 +2586,7 @@ impl Codegen { telemetry.report_assistant_event( None, telemetry_events::AssistantKind::Inline, + telemetry_events::AssistantPhase::Response, model_telemetry_id, response_latency, error_message, diff --git a/crates/assistant/src/terminal_inline_assistant.rs b/crates/assistant/src/terminal_inline_assistant.rs index 06661944d96a799932a7bfb9884843279e02d209..caf819bae535ee88bd2aed3eaa004f7b79c930c8 100644 --- a/crates/assistant/src/terminal_inline_assistant.rs +++ b/crates/assistant/src/terminal_inline_assistant.rs @@ -1066,6 +1066,7 @@ impl Codegen { telemetry.report_assistant_event( None, telemetry_events::AssistantKind::Inline, + telemetry_events::AssistantPhase::Response, model_telemetry_id, response_latency, error_message, diff --git a/crates/client/src/telemetry.rs b/crates/client/src/telemetry.rs index b415cae14c60a28f5e3436ae80eab4bc826cf846..46304819a4db5b2359a4b665f3742ee8a55c3270 100644 --- a/crates/client/src/telemetry.rs +++ b/crates/client/src/telemetry.rs @@ -16,9 +16,9 @@ use std::io::Write; use std::{env, mem, path::PathBuf, sync::Arc, time::Duration}; use sysinfo::{CpuRefreshKind, Pid, ProcessRefreshKind, RefreshKind, System}; use telemetry_events::{ - ActionEvent, AppEvent, AssistantEvent, AssistantKind, CallEvent, CpuEvent, EditEvent, - EditorEvent, Event, EventRequestBody, EventWrapper, ExtensionEvent, InlineCompletionEvent, - MemoryEvent, ReplEvent, SettingEvent, + ActionEvent, AppEvent, AssistantEvent, AssistantKind, AssistantPhase, CallEvent, CpuEvent, + EditEvent, EditorEvent, Event, EventRequestBody, EventWrapper, ExtensionEvent, + InlineCompletionEvent, MemoryEvent, ReplEvent, SettingEvent, }; use tempfile::NamedTempFile; #[cfg(not(debug_assertions))] @@ -391,6 +391,7 @@ impl Telemetry { self: &Arc, conversation_id: Option, kind: AssistantKind, + phase: AssistantPhase, model: String, response_latency: Option, error_message: Option, @@ -398,6 +399,7 @@ impl Telemetry { let event = Event::Assistant(AssistantEvent { conversation_id, kind, + phase, model: model.to_string(), response_latency, error_message, diff --git a/crates/collab/src/api/events.rs b/crates/collab/src/api/events.rs index 30ed10a76fb0c0ab20efff528e0fe3cecf1df6c1..45c25d261e1de8fea2fc8a45be06afbc155dfca5 100644 --- a/crates/collab/src/api/events.rs +++ b/crates/collab/src/api/events.rs @@ -834,6 +834,7 @@ pub struct AssistantEventRow { // AssistantEventRow conversation_id: String, kind: String, + phase: String, model: String, response_latency_in_ms: Option, error_message: Option, @@ -866,6 +867,7 @@ impl AssistantEventRow { time: time.timestamp_millis(), conversation_id: event.conversation_id.unwrap_or_default(), kind: event.kind.to_string(), + phase: event.phase.to_string(), model: event.model, response_latency_in_ms: event .response_latency diff --git a/crates/telemetry_events/src/telemetry_events.rs b/crates/telemetry_events/src/telemetry_events.rs index 87ecfb76b6f7e732d70af2ad282d39c1cce96c93..eb84322e83d94c7992645b6604232c7ad3d26b71 100644 --- a/crates/telemetry_events/src/telemetry_events.rs +++ b/crates/telemetry_events/src/telemetry_events.rs @@ -44,7 +44,6 @@ pub enum AssistantKind { Panel, Inline, } - impl Display for AssistantKind { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( @@ -58,6 +57,31 @@ impl Display for AssistantKind { } } +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum AssistantPhase { + #[default] + Response, + Invoked, + Accepted, + Rejected, +} + +impl Display for AssistantPhase { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}", + match self { + Self::Response => "response", + Self::Invoked => "invoked", + Self::Accepted => "accepted", + Self::Rejected => "rejected", + } + ) + } +} + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(tag = "type")] pub enum Event { @@ -121,6 +145,8 @@ pub struct AssistantEvent { pub conversation_id: Option, /// The kind of assistant (Panel, Inline) pub kind: AssistantKind, + #[serde(default)] + pub phase: AssistantPhase, /// Name of the AI model used (gpt-4o, claude-3-5-sonnet, etc) pub model: String, pub response_latency: Option,