assistant: Add tracking fields to Codegen for alternative assists (#19467)

Added some tracking fields to Codegen and CodegenAlternatives in order
to collect data for experimentation in a fork.

Release Notes:

- N/A
This commit is contained in:
Adam Wolff 2024-10-22 09:45:01 -07:00 committed by GitHub
parent ce11ca9d49
commit ab98d4889b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2256,6 +2256,7 @@ pub enum CodegenEvent {
pub struct Codegen { pub struct Codegen {
alternatives: Vec<Model<CodegenAlternative>>, alternatives: Vec<Model<CodegenAlternative>>,
active_alternative: usize, active_alternative: usize,
seen_alternatives: HashSet<usize>,
subscriptions: Vec<Subscription>, subscriptions: Vec<Subscription>,
buffer: Model<MultiBuffer>, buffer: Model<MultiBuffer>,
range: Range<Anchor>, range: Range<Anchor>,
@ -2286,6 +2287,7 @@ impl Codegen {
let mut this = Self { let mut this = Self {
alternatives: vec![codegen], alternatives: vec![codegen],
active_alternative: 0, active_alternative: 0,
seen_alternatives: HashSet::default(),
subscriptions: Vec::new(), subscriptions: Vec::new(),
buffer, buffer,
range, range,
@ -2338,6 +2340,7 @@ impl Codegen {
fn activate(&mut self, index: usize, cx: &mut ModelContext<Self>) { fn activate(&mut self, index: usize, cx: &mut ModelContext<Self>) {
self.active_alternative() self.active_alternative()
.update(cx, |codegen, cx| codegen.set_active(false, cx)); .update(cx, |codegen, cx| codegen.set_active(false, cx));
self.seen_alternatives.insert(index);
self.active_alternative = index; self.active_alternative = index;
self.active_alternative() self.active_alternative()
.update(cx, |codegen, cx| codegen.set_active(true, cx)); .update(cx, |codegen, cx| codegen.set_active(true, cx));
@ -2467,6 +2470,8 @@ pub struct CodegenAlternative {
active: bool, active: bool,
edits: Vec<(Range<Anchor>, String)>, edits: Vec<(Range<Anchor>, String)>,
line_operations: Vec<LineOperation>, line_operations: Vec<LineOperation>,
request: Option<LanguageModelRequest>,
elapsed_time: Option<f64>,
} }
enum CodegenStatus { enum CodegenStatus {
@ -2538,6 +2543,8 @@ impl CodegenAlternative {
edits: Vec::new(), edits: Vec::new(),
line_operations: Vec::new(), line_operations: Vec::new(),
range, range,
request: None,
elapsed_time: None,
} }
} }
@ -2634,6 +2641,7 @@ impl CodegenAlternative {
async { Ok(stream::empty().boxed()) }.boxed_local() async { Ok(stream::empty().boxed()) }.boxed_local()
} else { } else {
let request = self.build_request(user_prompt, assistant_panel_context, cx)?; let request = self.build_request(user_prompt, assistant_panel_context, cx)?;
self.request = Some(request.clone());
let chunks = cx let chunks = cx
.spawn(|_, cx| async move { model.stream_completion_text(request, &cx).await }); .spawn(|_, cx| async move { model.stream_completion_text(request, &cx).await });
@ -2707,6 +2715,7 @@ impl CodegenAlternative {
stream: impl 'static + Future<Output = Result<BoxStream<'static, Result<String>>>>, stream: impl 'static + Future<Output = Result<BoxStream<'static, Result<String>>>>,
cx: &mut ModelContext<Self>, cx: &mut ModelContext<Self>,
) { ) {
let start_time = Instant::now();
let snapshot = self.snapshot.clone(); let snapshot = self.snapshot.clone();
let selected_text = snapshot let selected_text = snapshot
.text_for_range(self.range.start..self.range.end) .text_for_range(self.range.start..self.range.end)
@ -2923,6 +2932,8 @@ impl CodegenAlternative {
}; };
let result = generate.await; let result = generate.await;
let elapsed_time = start_time.elapsed().as_secs_f64();
codegen codegen
.update(&mut cx, |this, cx| { .update(&mut cx, |this, cx| {
this.last_equal_ranges.clear(); this.last_equal_ranges.clear();
@ -2931,6 +2942,7 @@ impl CodegenAlternative {
} else { } else {
this.status = CodegenStatus::Done; this.status = CodegenStatus::Done;
} }
this.elapsed_time = Some(elapsed_time);
cx.emit(CodegenEvent::Finished); cx.emit(CodegenEvent::Finished);
cx.notify(); cx.notify();
}) })