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