Skip to main content

lash_remote_protocol/protocol/
prompt.rs

1#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
2pub struct RemotePromptLayer {
3    #[serde(default, skip_serializing_if = "Option::is_none")]
4    pub template: Option<RemotePromptTemplate>,
5    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
6    pub slots: HashMap<RemotePromptSlot, RemotePromptSlotLayer>,
7}
8
9impl RemotePromptLayer {
10    pub fn new() -> Self {
11        Self::default()
12    }
13
14    pub fn is_empty(&self) -> bool {
15        self.template.is_none() && self.slots.is_empty()
16    }
17}
18
19#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
20#[serde(rename_all = "snake_case")]
21pub enum RemotePromptBuiltin {
22    MainAgentIntro,
23    ExecutionInstructions,
24    CoreGuidance,
25}
26
27#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
28#[serde(rename_all = "snake_case")]
29pub enum RemotePromptSlot {
30    Intro,
31    Execution,
32    Guidance,
33    ProjectInstructions,
34    RuntimeContext,
35    Environment,
36}
37
38#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
39#[serde(tag = "kind", rename_all = "snake_case")]
40pub enum RemotePromptTemplateEntry {
41    Text { content: String },
42    Builtin { builtin: RemotePromptBuiltin },
43    Slot { slot: RemotePromptSlot },
44}
45
46#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
47pub struct RemotePromptTemplateSection {
48    #[serde(default, skip_serializing_if = "Option::is_none")]
49    pub title: Option<String>,
50    #[serde(default, skip_serializing_if = "Vec::is_empty")]
51    pub entries: Vec<RemotePromptTemplateEntry>,
52}
53
54#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
55pub struct RemotePromptTemplate {
56    pub sections: Vec<RemotePromptTemplateSection>,
57}
58
59#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
60pub struct RemotePromptSlotLayer {
61    #[serde(default)]
62    pub reset: bool,
63    #[serde(default, skip_serializing_if = "Vec::is_empty")]
64    pub contributions: Vec<RemotePromptContribution>,
65}
66
67#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
68pub struct RemotePromptContribution {
69    pub slot: RemotePromptSlot,
70    #[serde(default, skip_serializing_if = "Option::is_none")]
71    pub title: Option<String>,
72    #[serde(default)]
73    pub priority: i32,
74    #[serde(
75        default,
76        skip_serializing_if = "RemotePromptContributionGate::is_empty"
77    )]
78    pub gate: RemotePromptContributionGate,
79    pub content: String,
80}
81
82#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
83pub struct RemotePromptContributionGate {
84    #[serde(default, skip_serializing_if = "Vec::is_empty")]
85    pub tools: Vec<String>,
86    #[serde(default)]
87    pub minimum_availability: RemoteToolAvailability,
88}
89
90impl RemotePromptContributionGate {
91    pub fn is_empty(&self) -> bool {
92        self.tools.is_empty()
93    }
94}