Skip to main content

rushai_protocol/
parts.rs

1use serde::{Deserialize, Serialize};
2
3use crate::ids::CallId;
4use crate::usage::TokenUsage;
5
6/// A user-authored input part.
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8#[serde(tag = "type", rename_all = "snake_case")]
9pub enum UserPart {
10    Text { text: String },
11    File { path: String },
12}
13
14/// One part of a stored message.
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16#[serde(tag = "type", rename_all = "snake_case")]
17pub enum Part {
18    Text {
19        text: String,
20    },
21    Reasoning {
22        text: String,
23        #[serde(default, skip_serializing_if = "Option::is_none")]
24        signature: Option<String>,
25    },
26    ToolCall {
27        id: CallId,
28        name: String,
29        input: serde_json::Value,
30    },
31    ToolResult {
32        id: CallId,
33        content: String,
34        is_error: bool,
35    },
36    File {
37        path: String,
38    },
39    Finish {
40        reason: FinishReason,
41        usage: TokenUsage,
42    },
43}
44
45/// An incremental update to a part under construction.
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
47#[serde(tag = "type", rename_all = "snake_case")]
48pub enum PartDelta {
49    Text { delta: String },
50    Reasoning { delta: String },
51    ToolInput { json: String },
52}
53
54#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
55#[serde(rename_all = "snake_case")]
56pub enum FinishReason {
57    EndTurn,
58    ToolUse,
59    MaxTokens,
60    Canceled,
61    Error,
62}
63
64#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
65#[serde(rename_all = "snake_case")]
66pub enum Role {
67    User,
68    Assistant,
69}