plexus_substrate/activations/cone/
types.rs1use crate::activations::arbor::{NodeId, TreeId};
2use plexus_macros::HandleEnum;
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use uuid::Uuid;
6
7use super::activation::Cone;
8
9pub type ConeId = Uuid;
11
12#[derive(Debug, Clone, HandleEnum)]
21#[handle(plugin_id = "Cone::PLUGIN_ID", version = "1.0.0")]
22pub enum ConeHandle {
23 #[handle(
26 method = "chat",
27 table = "messages",
28 key = "id",
29 key_field = "message_id",
30 strip_prefix = "msg-"
31 )]
32 Message {
33 message_id: String,
35 role: String,
37 name: String,
39 },
40}
41
42pub type MessageId = Uuid;
44
45#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
47#[serde(rename_all = "snake_case")]
48pub enum MessageRole {
49 User,
50 Assistant,
51 System,
52}
53
54impl MessageRole {
55 pub fn as_str(&self) -> &'static str {
56 match self {
57 MessageRole::User => "user",
58 MessageRole::Assistant => "assistant",
59 MessageRole::System => "system",
60 }
61 }
62
63 pub fn from_str(s: &str) -> Option<Self> {
64 match s {
65 "user" => Some(MessageRole::User),
66 "assistant" => Some(MessageRole::Assistant),
67 "system" => Some(MessageRole::System),
68 _ => None,
69 }
70 }
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct Message {
76 pub id: MessageId,
77 pub cone_id: ConeId,
78 pub role: MessageRole,
79 pub content: String,
80 pub created_at: i64,
81 pub model_id: Option<String>,
83 pub input_tokens: Option<i64>,
85 pub output_tokens: Option<i64>,
86}
87
88#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, schemars::JsonSchema)]
91pub struct Position {
92 pub tree_id: TreeId,
94 pub node_id: NodeId,
96}
97
98impl Position {
99 pub fn new(tree_id: TreeId, node_id: NodeId) -> Self {
101 Self { tree_id, node_id }
102 }
103
104 pub fn advance(&self, new_node_id: NodeId) -> Self {
106 Self {
107 tree_id: self.tree_id,
108 node_id: new_node_id,
109 }
110 }
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
115pub struct ConeConfig {
116 pub id: ConeId,
118 pub name: String,
120 pub model_id: String,
122 pub system_prompt: Option<String>,
124 pub head: Position,
127 pub metadata: Option<Value>,
129 pub created_at: i64,
131 pub updated_at: i64,
133}
134
135impl ConeConfig {
136 pub fn tree_id(&self) -> TreeId {
138 self.head.tree_id
139 }
140
141 pub fn node_id(&self) -> NodeId {
143 self.head.node_id
144 }
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
149pub struct ConeInfo {
150 pub id: ConeId,
151 pub name: String,
152 pub model_id: String,
153 pub head: Position,
154 pub created_at: i64,
155}
156
157impl From<&ConeConfig> for ConeInfo {
158 fn from(config: &ConeConfig) -> Self {
159 Self {
160 id: config.id,
161 name: config.name.clone(),
162 model_id: config.model_id.clone(),
163 head: config.head,
164 created_at: config.created_at,
165 }
166 }
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
176#[serde(tag = "type")]
177pub enum CreateResult {
178 #[serde(rename = "cone_created")]
179 Created {
180 cone_id: ConeId,
181 head: Position,
183 },
184 #[serde(rename = "error")]
185 Error { message: String },
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
190#[serde(tag = "type")]
191pub enum GetResult {
192 #[serde(rename = "cone_data")]
193 Data { cone: ConeConfig },
194 #[serde(rename = "error")]
195 Error { message: String },
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
200#[serde(tag = "type")]
201pub enum ListResult {
202 #[serde(rename = "cone_list")]
203 List { cones: Vec<ConeInfo> },
204 #[serde(rename = "error")]
205 Error { message: String },
206}
207
208#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
210#[serde(tag = "type")]
211pub enum DeleteResult {
212 #[serde(rename = "cone_deleted")]
213 Deleted { cone_id: ConeId },
214 #[serde(rename = "error")]
215 Error { message: String },
216}
217
218#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
220#[serde(tag = "type")]
221pub enum ChatEvent {
222 #[serde(rename = "chat_start")]
224 Start {
225 cone_id: ConeId,
226 user_position: Position,
228 },
229 #[serde(rename = "chat_content")]
231 Content {
232 cone_id: ConeId,
233 content: String,
234 },
235 #[serde(rename = "chat_complete")]
237 Complete {
238 cone_id: ConeId,
239 new_head: Position,
241 usage: Option<ChatUsage>,
243 },
244 #[serde(rename = "error")]
245 Error { message: String },
246}
247
248#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
250#[serde(tag = "type")]
251pub enum SetHeadResult {
252 #[serde(rename = "head_updated")]
253 Updated {
254 cone_id: ConeId,
255 old_head: Position,
256 new_head: Position,
257 },
258 #[serde(rename = "error")]
259 Error { message: String },
260}
261
262#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
264#[serde(tag = "type")]
265pub enum RegistryResult {
266 #[serde(rename = "registry")]
267 Registry(cllient::RegistryExport),
268}
269
270#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
272#[serde(tag = "type")]
273pub enum ResolveResult {
274 #[serde(rename = "resolved_message")]
275 Message {
276 id: String,
277 role: String,
278 content: String,
279 model: Option<String>,
280 name: String,
281 },
282 #[serde(rename = "error")]
283 Error { message: String },
284}
285
286#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
288pub struct ChatUsage {
289 pub input_tokens: Option<u64>,
290 pub output_tokens: Option<u64>,
291 pub total_tokens: Option<u64>,
292}
293
294#[derive(Debug, Clone)]
296pub struct ConeError {
297 pub message: String,
298}
299
300impl std::fmt::Display for ConeError {
301 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
302 write!(f, "{}", self.message)
303 }
304}
305
306impl std::error::Error for ConeError {}
307
308impl From<String> for ConeError {
309 fn from(s: String) -> Self {
310 Self { message: s }
311 }
312}
313
314impl From<&str> for ConeError {
315 fn from(s: &str) -> Self {
316 Self { message: s.to_string() }
317 }
318}