predict_edits_v3.rs

  1use chrono::Duration;
  2use serde::{Deserialize, Serialize};
  3use std::{ops::Range, path::PathBuf};
  4use uuid::Uuid;
  5
  6use crate::PredictEditsGitInfo;
  7
  8// TODO: snippet ordering within file / relative to excerpt
  9
 10#[derive(Debug, Clone, Serialize, Deserialize)]
 11pub struct PredictEditsRequest {
 12    pub excerpt: String,
 13    pub excerpt_path: PathBuf,
 14    /// Within file
 15    pub excerpt_range: Range<usize>,
 16    /// Within `excerpt`
 17    pub cursor_offset: usize,
 18    /// Within `signatures`
 19    pub excerpt_parent: Option<usize>,
 20    pub signatures: Vec<Signature>,
 21    pub referenced_declarations: Vec<ReferencedDeclaration>,
 22    pub events: Vec<Event>,
 23    #[serde(default)]
 24    pub can_collect_data: bool,
 25    #[serde(skip_serializing_if = "Vec::is_empty", default)]
 26    pub diagnostic_groups: Vec<DiagnosticGroup>,
 27    /// Info about the git repository state, only present when can_collect_data is true.
 28    #[serde(skip_serializing_if = "Option::is_none", default)]
 29    pub git_info: Option<PredictEditsGitInfo>,
 30    #[serde(default)]
 31    pub debug_info: bool,
 32}
 33
 34#[derive(Debug, Clone, Serialize, Deserialize)]
 35#[serde(tag = "event")]
 36pub enum Event {
 37    BufferChange {
 38        path: Option<PathBuf>,
 39        old_path: Option<PathBuf>,
 40        diff: String,
 41        predicted: bool,
 42    },
 43}
 44
 45#[derive(Debug, Clone, Serialize, Deserialize)]
 46pub struct Signature {
 47    pub text: String,
 48    pub text_is_truncated: bool,
 49    #[serde(skip_serializing_if = "Option::is_none", default)]
 50    pub parent_index: Option<usize>,
 51    /// Range of `text` within the file, possibly truncated according to `text_is_truncated`. The
 52    /// file is implicitly the file that contains the descendant declaration or excerpt.
 53    pub range: Range<usize>,
 54}
 55
 56#[derive(Debug, Clone, Serialize, Deserialize)]
 57pub struct ReferencedDeclaration {
 58    pub path: PathBuf,
 59    pub text: String,
 60    pub text_is_truncated: bool,
 61    /// Range of `text` within file, possibly truncated according to `text_is_truncated`
 62    pub range: Range<usize>,
 63    /// Range within `text`
 64    pub signature_range: Range<usize>,
 65    /// Index within `signatures`.
 66    #[serde(skip_serializing_if = "Option::is_none", default)]
 67    pub parent_index: Option<usize>,
 68    pub score_components: ScoreComponents,
 69    pub signature_score: f32,
 70    pub declaration_score: f32,
 71}
 72
 73#[derive(Debug, Clone, Serialize, Deserialize)]
 74pub struct ScoreComponents {
 75    pub is_same_file: bool,
 76    pub is_referenced_nearby: bool,
 77    pub is_referenced_in_breadcrumb: bool,
 78    pub reference_count: usize,
 79    pub same_file_declaration_count: usize,
 80    pub declaration_count: usize,
 81    pub reference_line_distance: u32,
 82    pub declaration_line_distance: u32,
 83    pub declaration_line_distance_rank: usize,
 84    pub containing_range_vs_item_jaccard: f32,
 85    pub containing_range_vs_signature_jaccard: f32,
 86    pub adjacent_vs_item_jaccard: f32,
 87    pub adjacent_vs_signature_jaccard: f32,
 88    pub containing_range_vs_item_weighted_overlap: f32,
 89    pub containing_range_vs_signature_weighted_overlap: f32,
 90    pub adjacent_vs_item_weighted_overlap: f32,
 91    pub adjacent_vs_signature_weighted_overlap: f32,
 92}
 93
 94#[derive(Debug, Clone, Serialize, Deserialize)]
 95pub struct DiagnosticGroup {
 96    pub language_server: String,
 97    pub diagnostic_group: serde_json::Value,
 98}
 99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct PredictEditsResponse {
102    pub request_id: Uuid,
103    pub edits: Vec<Edit>,
104    pub debug_info: Option<DebugInfo>,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108pub struct DebugInfo {
109    pub prompt: String,
110    pub prompt_planning_time: Duration,
111    pub model_response: String,
112    pub inference_time: Duration,
113    pub parsing_time: Duration,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct Edit {
118    pub path: PathBuf,
119    pub range: Range<usize>,
120    pub content: String,
121}